簡體   English   中英

使用C#驅動程序在MongoDB中搜索對象數組

[英]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驅動程序源代碼,但是找不到如何做我想要的事情。 我是否缺少明顯的東西?

EQ方法僅接受BSONValue作為參數,但是您正在嘗試傳遞IMongoQuery實例。

在第二個查詢中,您基本上是在MetaData數組中搜索此文檔:

{"FileExtension":"TXT"}

您將需要創建一個新的BsonDocument並將其傳遞到您的EQ方法中:

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

您可以查看EQ方法文檔以了解更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM