簡體   English   中英

MongoDb c#driver按字段值查找數組中的項目

[英]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.ElemMatchAny表達式:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM