2015-08-03 79 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的驱动程序使用的聚合框架,但没有聚集运营商查询发现是快。

请注意,这在以前版本的驱动程序中已被打破,因此在原始发布时答案不可用。

相关问题