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

时间:2015-08-03 11:36:22

标签: c# mongodb mongodb-.net-driver mongodb-csharp-2.0

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

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

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

UPD

我认为它是某种

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

但现在无法检查,有人可以提供帮助吗?

4 个答案:

答案 0 :(得分:29)

ElemMatch

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

答案 1 :(得分:5)

您需要n=14 A=cell(n,1) for k=1:n A{k}=TrajSimilarity(1,k).aLongestString; end 运算符。您可以使用$elemMatchBuilders<T>.Filter.ElemMatch表达式:

Any

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

答案 2 :(得分:4)

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

简单数据模型

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
}

选项1(聚合)

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(Filter&amp; Linq)这对我来说慢了约5倍

if (!$result) {
    die('query is not correct'.mysqli_error($conn));//$con is your database connection paste it after $result = mysqli_query($conn, $sql);
}

答案 3 :(得分:2)

从C#驱动程序的2.4.2版本开始,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驱动程序使用聚合框架,但对于没有聚合运算符的查询,查找速度更快。

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