簡體   English   中英

MongoDB查詢未返回任何結果

[英]MongoDB query returning no results

我是mongo的新手,正在嘗試在此集合中執行一個非常簡單的查詢:

{
    "_id" : ObjectId("gdrgrdgrdgdr"),
    "administrators" : {
        "-HGFsfes" : {
            "name" : "Jose",
            "phone" : NumberLong(124324)
        },
        "-HGFsfqs" : {
            "name" : "Peter",
            "phone" : "+43242342"
        }
    },
    "countries" : {
        "-dgfgrdg : {
            "lang" : "en",
            "name" : "Canada"
        },
        "-grdgrdg" : {
            "lang" : "en",
            "name" : "USA"
        }
    }
}

例如,如何進行查詢以返回名稱為“%Jos%”的管理員的結果。

到目前為止,我所做的是: db.getCollection('coll').find({ "administrators.name": /Jos/});

以及這種變化。 但是我嘗試的每件事都返回零結果。

我究竟做錯了什么?

提前致謝!

您需要使用如下查詢:

db.collection_name.find({})

因此,如果您的集合名稱是coll,則它將是:

db.coll.find({"administrators.-HGFsfes.name": /Jos/});

看看在蒙戈像查詢。

另外,嘗試使用正則表達式模式,如下所示:

db.coll.find({"administrators..-HGFsfes.name": {"$regex":"Jos", "$options":"i"}}});

它只會給您一個結果,因為您的數據不是以下屏幕截圖中的數組: 在此處輸入圖片說明

如果要獲得多個結果,則需要重組數據。

您的錯誤是管理員不是數組,而是具有字段的對象本身就是具有名稱字段的對象。 正確的查詢將是

{ "administrators.-HGFsfes.name": /Jos/}

不幸的是,這種方式只查詢-HGFsfes名稱字段,而不查詢其他管理員名稱字段。

為了實現您想要的,唯一要做的就是用數組替換管理員對象,因此您的文檔將如下所示:

    { 
    "administrators" : [
        {
            "id" : "-HGFsfes", 
            "name" : "Jose", 
            "phone" : 124324
        }, 
        {
            "id" : "-HGFsfqs", 
            "name" : "Peter", 
            "phone" : "+43242342"
        }
    ], 
 countries : ...
}

這樣您的查詢將起作用。

但是它將返回文檔,其中管理員數組中至少一個條目具有匹配的名稱字段。 要僅返回管理員匹配的元素,而不是整個文檔, 請檢查此問題和我的答案以展開/匹配/組聚合管道。

好的,以為我為您找到了具有聚合框架的更好的解決方案。 在當前集合上運行以下查詢,將返回所有名稱為“ LIKE” jos的管理員(使用i選項不區分大小寫):

db.test1.aggregate(
    [
        {
            $project: {
              administrators:{    $objectToArray: "$administrators"}
            }
        },
        {
            $unwind: {
                path : "$administrators"
            }
        },
        {
            $replaceRoot: {
            newRoot:"$administrators"
            }
        },
        {
            $match: {
            "v.name":/jos/i
            }
        },
    ]
);

產量

{ 
    "k" : "-HGFsfes", 
    "v" : {
        "name" : "Jose", 
        "phone" : NumberLong(124324)
    }
}

“ k”和“ v”來自“ $ objectToArray”運算符 ,您可以添加$ project階段來重命名它們(如果k值無關緊要,則將其丟棄)

不確定是否要進行Robomongo測試,但是在Studio 3T(以前為Robomongo)中,您可以在Intellishell控制台中復制/粘貼此查詢,也可以在聚合選項卡中復制/導入(小圖標“從剪貼板粘貼”)。

希望能幫助到你。

暫無
暫無

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

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