首页 > 解决方案 > MongoDB C#查询包含属性值的对象数组

问题描述

我的文档中有一个数组属性。让我们称它为 arrayProperty,如下所示:

 {
  _id: mongoObjectIdThingy,
  arrayProperty: [
    {string1: "aString",otherProperty:"somethingelse"},
    {string1: "aString2",otherProperty:"somethingelse"}
  ]
}

我正在使用 mongodb c# 驱动程序。我想查找包含任何 string1 值列表的所有文档。例如说我有一个字符串列表:

["a","b","aString"]

我希望查询返回上述文档。我试过这个:

    var builder = Builders<MyObject>.Filter;

    var listToFind = new List<string>{"a","b","aString"};


    return builder.ElemMatch(o => o.arrayProperty,
        d => listToFind.Contains(d.string1));

但得到了这个例外:

不支持的过滤器:包含(值(System.Collections.Generic.List`1[System.String]))

似乎我无法在驱动程序的过滤器表达式中执行包含 linq 表达式。如何使用 C# 在 mongoDB 中编写这种类型的查询?

标签: c#mongodb

解决方案


我相信您正在寻找InFilterDefinition,它会使您的 Builder 看起来像这样;

return Builders<MyObject>.Filter.ElemMatch(
            o => o.arrayProperty,
            Builders<ArrayProperty>.Filter.In(y => y.string1, listToFind));

这构建了这个查询

db.MyObject.find({ "arrayProperty" : { "$elemMatch" : { "string1" : { "$in" : ["a", "b", "aString"] } } } })

为了能够使用正则表达式,您必须构建一个不同的查询(我不在喝咖啡,所以这没有任何保证)

        var listToFind = new List<string> { "a", "b", "astring" };

        var regexList = listToFind.Select(x => new BsonRegularExpression(x, "i"));

        var filterList = new List<FilterDefinition<MyObject>>();
        foreach (var bsonRegularExpression in regexList)
        {
            FilterDefinition<MyObject> fil = Builders<MyObject>.Filter.ElemMatch(o => o.arrayProperty, Builders<ArrayProperty>.Filter.Regex(
                 x => x.string1,
                 bsonRegularExpression));

            filterList.Add(fil);
        }


        var orFilter = Builders<MyObject>.Filter.Or(filterList);

        var result = collection.Find(orFilter).ToList();

构建以下查询

db.MyObject.find({ "$or" : [{ "arrayProperty" : { "$elemMatch" : { "string1" : /a/i } } }, { "arrayProperty" : { "$elemMatch" : { "string1" : /b/i } } }, { "arrayProperty" : { "$elemMatch" : { "string1" : /astring/i } } }] })

推荐阅读