MongoDbc#driverfindsaniteminarraybyfieldvalue我找到了检查简单数组中包含的值的方法:varfilter=建设者.Filter.AnyEq(x=>x.Tags,"mongodb");但是如何按特定字段查找字段多的复杂项呢?我找到了一种使用BsonDocument构建器通过点符号来编写它的方法,但是如何使用类型化的lambda符号呢?UPD我认为它类似于builderInst.AnyIn(p=>p.ComplexCollection.Select(ml=>ml.Id),mlIds)但现在无法检查,有人可以帮忙吗?有ElemMatchvarfilter=Builders.Filter.ElemMatch(x=>x.Tags,x=>x.Name=="test");varres=awaitcollection.Find(filter).ToListAsync()您需要$elemMatch运算符符号。您可以使用Builders.Filter.ElemMatch或Any表达式:Find(x=>x.Tags.Any(t=>t.Name=="test")).ToListAsync()http://mongodb.github.io/mongo-csharp-driver/2.0/reference/driver/expressions/#elemmatch从C#驱动程序的2.4.2版本开始,可以使用IFindFluent接口查询数组元素。ElemMatch不能直接在字符串数组上使用,而查找接口可以处理简单或复杂的类型(例如“Tags.Name”)并且是强类型的。FilterDefinitionBuildertcBuilder=Builders.Filter;FilterDefinitiontcFilter=tcBuilder.Eq("Tags","mongodb")&tcBuilder.Eq("Tags","asp.net");...等待myCollection.FindAsync(tcFilter);Linq驱动程序使用聚合框架,但对于没有聚合运算符的查询,查找速度更快。请注意,这在以前的驱动程序版本中已被破坏,因此在原始发布时没有答案。这是一个从数组返回单个复杂项的示例(使用MongoDB.Driverv2.5.0):简单数据模型publicclassZoo{publicListAnimals{get;放;}}publicclassAnimal{publicstringName{get;放;}}选项1(聚合)publicAnimalFindAnimalInZoo(stringanimalName){varzooWithAnimalFilter=Builders.Filter.ElemMatch(z=>z.Animals,a=>a.Name==animalName);返回_db.GetCollection("zoos").Aggregate().Match(zooWithAnimalFilter).Project(Builders.Projection.Expression(z=>z.Animals.FirstOrDefault(a=>a.Name==animalName))).FirstOrDefault();//或者。ToList()toreturnmultiple}Option2(Filter&Linq)这对我来说慢了5倍左右以上是C#学习教程:MongoDbc#driverFinditemsinarraybyfieldvalue如果对大家有帮助就分享完整内容有用需要了解更多C#学习教程,希望大家多多关注——publicAnimalFindAnimalInZoo(stringanimalName){//同上varzooWithAnimalFilter=Builders.Filter.ElemMatch(z=>z.Animals,a=>a.名称==动物名称);varzooWithAnimal=_db.GetCollection("zoos").Find(zooWithAnimalFilter).FirstOrDefault();返回zooWithAnimal.Animals.FirstOrDefault(a=>a.Name==animalName);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
