MongoDb c#driver按字段值查找数组中的项目

我发现检查的方法是在简单数组中包含的值:

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

但是如何通过具体领域找到包含许多字段的复杂项目? 我找到了用BsonDocument构建器通过点符号方法编写它的方法,但是如何使用类型化的lambda符号呢?

UPD

我觉得它有点像

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

但现在无法检查,有人可以帮忙吗?

ElemMatch

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

你需要$elemMatch运算符。 您可以使用Builders.Filter.ElemMatchAny表达式:

 Find(x => x.Tags.Any(t => t.Name == "test")).ToListAsync() 

http://mongodb.github.io/mongo-csharp-driver/2.0/reference/driver/expressions/#elemmatch

从2.4.2版本的C#驱动程序开始,IFindFluent接口可用于查询数组元素。 ElemMatch不能直接用于字符串数组,而find接口可以处理简单或复杂类型(例如“Tags.Name”)并且是强类型的。

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

Linq驱动程序使用聚合框架,但对于没有聚合运算符的查询,查找更快。

请注意,在以前版本的驱动程序中已经破坏了这一点,因此在原始发布时无法获得答案。

这是一个从数组中返回单个复杂项的示例(使用MongoDB.Driver v2.5.0):

简单数据模型

 public class Zoo { public List Animals { get; set; } } public class Animal { public string Name { get; set; } } 

选项1(聚合)

 public Animal FindAnimalInZoo(string animalName) { var zooWithAnimalFilter = Builders.Filter .ElemMatch(z => z.Animals, a => a.Name == animalName); return _db.GetCollection("zoos").Aggregate() .Match(zooWithAnimalFilter) .Project( Builders.Projection.Expression(z => z.Animals.FirstOrDefault(a => a.Name == animalName))) .FirstOrDefault(); // or .ToList() to return multiple } 

选项2(Filter&Linq)这对我来说慢了大约5倍

 public Animal FindAnimalInZoo(string animalName) { // Same as above var zooWithAnimalFilter = Builders.Filter .ElemMatch(z => z.Animals, a => a.Name == animalName); var zooWithAnimal = _db.GetCollection("zoos") .Find(zooWithAnimalFilter) .FirstOrDefault(); return zooWithAnimal.Animals.FirstOrDefault(a => a.Name == animalName); }