c# - 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 中编写这种类型的查询?
解决方案
我相信您正在寻找In
FilterDefinition,它会使您的 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 } } }] })
推荐阅读
- python - 如何从 kivy textinput 访问所选文本的开始和结束索引
- ios - 一个关于 iOS 自动布局与表格视图和自定大小表格视图单元格的谜团
- algorithm - 如何插入半排序列表?
- .net - 如何在给定日期的一周内获得工作日?
- rest - Acumatica - 通过 REST 进行通用查询
- python - 如何正确使用具有多个回归目标的形状决策图和力图?
- glob - {} 和 +() 之间的 glob 模式差异
- javascript - 在两个顺序请求之后,PostMan 响应对象包含第一个请求的响应
- dialogflow-cx - 设置 Dialogflow CX 以将录音保存在 Google Cloud Storage 中
- javascript - react-router-dom 不适用于 Express 后端的生产环境