gpt4 book ai didi

c# - 使用 C# 驱动程序在 MongoDB 中搜索对象数组

转载 作者:可可西里 更新时间:2023-11-01 10:43:45 28 4
gpt4 key购买 nike

遵循 this article 的建议我在文档中的对象数组上创建了一个 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 驱动程序源代码,但找不到如何做我想做的事。我错过了一些明显的东西吗?

最佳答案

EQ 方法仅接受 BSONValue 作为参数,但您正试图传递一个 IMongoQuery 实例。

在您的第二个查询中,您基本上是在 MetaData 数组中搜索此文档:

{"FileExtension":"TXT"}

您需要创建一个新的 BsonDocument 并将其传递给您的 EQ 方法:

Query.EQ("MetaData", new BsonDocument(leaf.Field, leaf.Value));

您可以查看 documentation for EQ method了解更多详情。

关于c# - 使用 C# 驱动程序在 MongoDB 中搜索对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24169849/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com