[英]MongoDb c# driver find item in array by field value
我發現檢查的方法是在簡單數組中包含的值:
var filter = Builders<Post>.Filter.AnyEq(x => x.Tags, "mongodb");
但是如何通過具體領域找到包含許多字段的復雜項目? 我找到了用BsonDocument
構建器通過點符號方法編寫它的方法,但是如何使用鍵入的lambda符號呢?
UPD
我覺得它有點像
builderInst.AnyIn(p => p.ComplexCollection.Select(ml => ml.Id), mlIds)
但現在無法檢查,有人可以幫忙嗎?
有ElemMatch
var filter = Builders<Post>.Filter.ElemMatch(x => x.Tags, x => x.Name == "test");
var res = await collection.Find(filter).ToListAsync()
你需要$elemMatch
運算符。 您可以使用Builders<T>.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
這是一個從數組中返回單個復雜項的示例(使用MongoDB.Driver v2.5.0):
簡單數據模型
public class Zoo
{
public List<Animal> Animals { get; set; }
}
public class Animal
{
public string Name { get; set; }
}
選項1(聚合)
public Animal FindAnimalInZoo(string animalName)
{
var zooWithAnimalFilter = Builders<Zoo>.Filter
.ElemMatch(z => z.Animals, a => a.Name == animalName);
return _db.GetCollection<Zoo>("zoos").Aggregate()
.Match(zooWithAnimalFilter)
.Project<Animal>(
Builders<Zoo>.Projection.Expression<Animal>(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<Zoo>.Filter
.ElemMatch(z => z.Animals, a => a.Name == animalName);
var zooWithAnimal = _db.GetCollection<Zoo>("zoos")
.Find(zooWithAnimalFilter)
.FirstOrDefault();
return zooWithAnimal.Animals.FirstOrDefault(a => a.Name == animalName);
}
從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驅動程序使用聚合框架,但對於沒有聚合運算符的查詢,查找更快。
請注意,在以前版本的驅動程序中已經破壞了這一點,因此在原始發布時無法獲得答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.