2016-01-11 40 views
0

我有一個現有的文檔調用吧,我有建立它serveral的過濾器如下:Mongo DB C#驅動程序:如何重新使用現有的過濾器來創建新文檔?

Builders<Bar>.Filter.Eq(x=>x.SomeString,"aaaa"); 

Builders<Bar>.Filter.Eq(x=>x.SomeInt,5343); 

foo的定義,酒吧是:

public class Foo 
    { 
     public string TestString { get; set; } 
     public int TestInt{get;set;} 
     public Bar Bar { get; set; } 
    } 
    public class Bar 
    { 
     public string SomeString { get; set; } 
     public int SomeInt { get; set; } 
    } 

我要當resue這些過濾器酒吧成爲Foo的一個子項目。 讓說,我有富文件:

Foo foo = new Foo(){ 
TestString = "FooString", 
Bar = new Bar(){SomeString = "BarString"} 
        } 

我怎樣才能通過過濾搜索富:

Builders<Foo>.Filter.Eq(x=>x.Testring,"FooString") & Builders<Bar>.Filter.Eq(x=>x.SomeString,"BarString")//reuse the existing filter 

有MongoDB中C#驅動程序可用於任何API?

回答

0

1)一般爲FooBar對象集合將被分離,如GridFS的確實與fs.filesfs.chunks和一對多關係。假設他們居住在同一個分貝叫foobar

var collectionFoo = _database.GetCollection<Foo>("foobar"); 
var collectionBar = _database.GetCollection<Bar>("foobar"); 
var f = Builders<Foo>.Filter; 
var b = Builders<Bar>.Filter; 
var filterFoo = f.Eq(x => x.TestString, "FooString") & f.Eq(x => x.Bar.SomeString, "BarString"); 
var filterBar = b.Eq(x => x.SomeString, "BarString"); 

沒有重用,酒吧是爲Foo的依賴對象訪問。您正在使用OR的FilterDefinition{of Foo}

2)包含BarFoo的異源集合。糟糕的設計,恕我直言。查詢使用BsonDocument。這是你如何編寫你的過濾器:var subDocBarfilter = Builders<BsonDocument>.Filter.Eq("Bar.SomeString", "BarString"); 而不是:var primaryBarFilter = Builders<BsonDocument>.Filter.Eq("SomeString", "BarString");您不能重複使用,嵌入字段的訪問方式與主字段不同。見Query by a Field in an Embedded Document C# driver Mongo docs

3)爲Foo和Bar創造了一些通用基類型。這將使您能夠合併FilterDefinition<Foo>FilterDefinition<Bar>並使用某種工廠。例如abstract class IHaveId { public int id {get; set;} },其中Foo : IHaveIdBar : IHaveId

string GetSomeStringFromBarFactory(IHaveId x) { 
    string s = ""; 
    if (x is Bar) s= (x as Bar).SomeString; 
    else if (x is Foo) s= (x as Foo).Bar.SomeString; 
    return s; 
} 

然後,你將不得不管理FuncExpression轉換,從Func<IHaveId, string>Expression<Func<IHaveId, string>>不容易/最好的任務

Expression<Func<IHaveId, string>> expr = ConvertFunc2Expression (GetSomeStringFromBarFactory); 
Builders<IHaveId>.Filter.Eq (expr, "BarString"); 

綜上所述,我不認爲蒙戈C#驅動程序的當前架構(2.0版)允許或使得可取這樣的抽象。

+0

感謝您的回答! –

相關問題