[英]MongoDB Driver C# Update a single field in Nested Array of Objects
[英]Searching an array of objects in MongoDB using the C# Driver
按照本文的建议,我在文档中的对象数组上创建了一个Blob索引。 例如:
{
...
"itemID" : 37,
"MetaData" : [
{
"FileExtension" : "TXT"
},
{
"EmailSubject" : "GAS DESK HEAD MEETING"
},
{
"DocumentType" : "EMAIL"
},
{
"Date_BestEmailSent" : ISODate("2001-01-26T04:11:32.000Z")
},
{
"Date_ParentDate_BestDate" : ISODate("2001-01-26T04:11:32.000Z")
},
...
],
...
}
我现在正在解析C#中的搜索树,以使用MongoDB C#驱动程序来构建查询:
IMongoQuery expression;
switch (leaf.Op)
{
case SearchOperation.Equals:
expression = Query.EQ(leaf.Field, leaf.Value);
break;
case SearchOperation.Contains:
expression = Query.Matches(leaf.Field, leaf.Field);
break;
...
}
if (_rootLevelFields.Contains(leaf.Field))
{
return expression;
}
return Query.ElemMatch("MetaData", expression);
在这种情况下,如果我的搜索条件是FileExtension EQ 'TXT'
,它将运行:
db.test.find({"MetaData": {$elemMatch: {"FileExtension":"TXT"}}})
这运行非常缓慢,并且解释说明它正在扫描所有记录,而不使用我的索引。 如果我手动运行:
db.test.find({"MetaData": {"FileExtension":"TXT"}})
它使用索引并且运行更快。 在这种情况下,我似乎不想使用ElemMatch,但是MongoDB Builder命名空间似乎无法容纳这种查询,例如
Query.EQ("MetaData", expression);
在语法上不正确。 我已经遍历了文档甚至MongoDB驱动程序源代码,但是找不到如何做我想要的事情。 我是否缺少明显的东西?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.