Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB C#查询包含属性值的对象数组_C#_Mongodb - Fatal编程技术网

MongoDB C#查询包含属性值的对象数组

MongoDB C#查询包含属性值的对象数组,c#,mongodb,C#,Mongodb,我的文档中有一个数组属性。我们将其称为arrayProperty,如下所示: { _id: mongoObjectIdThingy, arrayProperty: [ {string1: "aString",otherProperty:"somethingelse"}, {string1: "aString2",otherProperty:"somethingelse"} ] } 我正在使用mongodb c#驱动程序。我想查找所有包含string1值列表的文档。

我的文档中有一个数组属性。我们将其称为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));
var builder=Builders.Filter;
var listToFind=新列表{“a”、“b”、“aString”};
返回builder.ElemMatch(o=>o.arrayProperty,
d=>listToFind.Contains(d.string1));
但有一个例外:

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


似乎我无法在驱动程序的筛选器表达式中创建包含linq的表达式。如何在mongoDB中用C#编写这种类型的查询?

我相信您正在过滤器定义中寻找
,这将使您的构建器看起来像这样

return Builders<MyObject>.Filter.ElemMatch(
            o => o.arrayProperty,
            Builders<ArrayProperty>.Filter.In(y => y.string1, listToFind));
为了能够使用正则表达式,您必须构建一个不同的查询(我不喝咖啡,所以这是没有任何保证的)


另一种解决方法是使用“Any”而不是“Contain”


你的答案中使用的过滤器内定义在哪里?很好,我在这里写错了部分。现在更新@CobolShmm很难实现这一点。是我的对象数组的类型吗?或者是某个MongoDB驱动程序内置于类中?这是我假设您的模型为
arrayProperty
数组所使用的类。你能发布你的模型吗?回答你的问题,是的,这是你的对象数组的类型。好的,很酷,谢谢!然而,最后一个问题是我希望搜索不区分大小写。在in子句中是否要传递一个标志?它对我有效,您使用的是哪个版本?
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 } } }] })
return builder.ElemMatch(o => o.arrayProperty,
        d => listToFind.Any(y => y == d.string1));