3

考慮存儲爲文件下列對象結構嵌套陣列上過濾器製造商:查詢使用MongoDB的C#驅動

public class Foo 
{ 
    public string Id { get; set; } 
    public ICollection<FooBar> Bars { get; set; } 

    // ... 
} 

public class FooBar 
{ 
    public string BarId { get; set; } 

    // ... 
} 

使用LINQ風格的查詢與司機,我可以Find所有Foo包含一個FooBarBarId像這樣的:

var foos = await m_fooCollection.Find(f => f.Bars.Any(fb => fb.BarId == "123")).ToListAsync(); 

如何在Find使用的FilterDefinitionBuilder而不是在線LINQ我實現這個相同的查詢?

+0

它不是LINQ,只是一個lambda表達式。 – i3arnon

+0

'.Any'在'ICollection'上是'System.Linq'命名空間中'Enumerable'類的一部分,對嗎? – kspearrin

+0

的確,但這種方法永遠不會被調用。驅動程序將表達式轉換爲mongo查詢。 – i3arnon

回答

6

您需要執行的查詢使用$elemMatch查詢運算符。

所以,這個查詢使用Lambda表達式

var findFluent = collection.Find(f => f.Bars.Any(fb => fb.BarId == "123")); 

使用FilterDefinitionBuilder等效於此查詢:

var findFluent = collection.Find(Builders<Foo>.Filter.ElemMatch(
    foo => foo.Bars, 
    foobar => foobar.BarId == "123")); 
+0

如果我有BarNumber屬性而不是BarId,並且有兩個BarNumber的值相同,該怎麼辦?我怎麼能得到他們兩個? – umtc

+0

@ i3arnon,它返回符合條件的所有'Foo'對象,每個對象都有其所有'FooBar'子元素。如果我也需要過濾這些子對象(使用'BarId =「123」'),那麼不是所有的FooBar都會出現在結果中? – benjamin54

+0

@ benjamin54我不認爲你可以用「簡單」查詢來做到這一點。我認爲你需要使用聚合框架,但我不確定。也許你會更好地提出另一個問題... – i3arnon

相關問題