2015-08-03 80 views
14

發現陣列項目,我發現,檢查的方法是價值中包含簡單的數組:MongoDB的C#驅動程序通過字段值

var filter = Builders<Post>.Filter.AnyEq(x => x.Tags, "mongodb"); 

但是如何通過一個具體的領域找到許多領域一個複雜的項目嗎? 我找到了用BsonDocument構建器通過點符號方法編寫它的方法,但是如何使用鍵入的lambda表示法來完成此操作?

UPD

我覺得某種

builderInst.AnyIn(p => p.ComplexCollection.Select(ml => ml.Id), mlIds) 

,但現在還不能查,是任何人都可以幫助嗎?

+0

看起來像MongoDb大學的作業。 –

+0

[MongoDB + C#驅動程序+查詢元素的數組,其中每個數組元素包含要查詢的子文檔]的可能重複(http://stackoverflow.com/questions/12024087/mongodb-c-sharp-driver-query-array -of-elements-where-each-array-element-cont) –

回答

16

ElemMatch

var filter = Builders<Post>.Filter.ElemMatch(x => x.Tags, x => x.Name == "test"); 
var res = await collection.Find(filter).ToListAsync() 
+0

這不是一個最佳解決方案。最好的解決方案是使用http://api.mongodb.com/csharp/current/html/M_MongoDB_Driver_FilterDefinitionBuilder_1_AnyIn__1_1.htm – shiva8

+2

@ shiva8當你有複雜對象數組時,你不能使用'AnyIn'。 – rnofenko

1

作爲2.4.2版本的C#驅動器的,所述IFindFluent界面可以用於查詢陣列元件上。 ElemMatch不能直接用在字符串數組上,而find接口可以用於簡單類型或複雜類型(例如'Tags.Name')並且是強類型的。

  FilterDefinitionBuilder<Post> tcBuilder = Builders<Post>.Filter; 
      FilterDefinition<Post> tcFilter = tcBuilder.Eq("Tags","mongodb") & tcBuilder.Eq("Tags","asp.net"); 
       ... 
      await myCollection.FindAsync(tcFilter); 

LINQ的驅動程序使用的聚合框架,但沒有聚集運營商查詢發現是快。

請注意,這在以前版本的驅動程序中已被打破,因此在原始發佈時答案不可用。

相關問題