2014-11-08 62 views
1

我有這樣如何從MongoDB獲取匹配的子文件?

{ 
    "_id" : ObjectId("545dad3562fa028fb48832f0"), 
    "key" : "123456", 
    "members" : [ 
      { 
        "name" : "Shiva", 
        "country" : "India", 
        "profession" : "Software" 
      }, 
      { 
        "name" : "Neil", 
        "country" : "Australia", 
        "profession" : "Software" 
      }, 
      { 
        "name" : "anil", 
        "country" : "India", 
        "profession" : "Software" 
      } 

    ] 
} 

集合現在我想檢索與國印度的記錄。 當我試圖這樣

db.user_details.find({ 'key' :'123456','members':{$elemMatch:{'country': "India"}}}, {'members.$': 1}).pretty() 

在執行上面的代碼我得到只有第一次出現,如何從文件

回答

3

$elemMatch運營商處獲得所有匹配的子文檔(如name:Shivaname:Anil)沿對方positional $運營商目前只會匹配符合指定條件的第一個元素。

爲了得到「多於一個的」匹配,最好的方法是使用聚合框架:

db.user_details.aggregate([ 
    # Always match first to at least find the "documents" with matching elements 
    { "$match": { 
     "members.country": "India" 
    }}, 

    # Use $unwind to "de-normalize" the array as individual documents 
    { "$unwind": "$members" }, 

    # Then match again to "filter" the content down to matches 
    { "$match": { 
     "members.country": "India" 
    }}, 

    # Group back to keep an array 
    { "$group": { 
     "_id": "$_id", 
     "key": { "$first": "$key" }, 
     "members": { "$push": "$members" } 
    }} 
]) 

即用於從數組「過濾」多於一個的匹配的基本過程。基本投影目前不能做到。

它返回這樣的:

{ 
    "_id" : ObjectId("545dad3562fa028fb48832f0"), 
    "key" : "123456", 
    "members" : [ 
      { 
        "name" : "Shiva", 
        "country" : "India", 
        "profession" : "Software" 
      }, 
      { 
        "name" : "anil", 
        "country" : "India", 
        "profession" : "Software" 
      } 
    ] 
} 
+0

我應該在哪裏把我的'key'值在查詢中,由於沒有記錄顯示,上面的查詢。 – Mulagala 2014-11-08 07:56:22

+0

@Mulagala相信我,如果我用你的數據對一個集合運行這個集合(現在糾正),那麼它會返回匹配'「國家」的元素:「印度」。 – 2014-11-08 08:00:18

+0

是的,我明白了,我怎麼才能得到一個特定的文件與給定的條件檢查與鍵值123456.因爲我得到的值與鍵'123'也不只是鍵vlaue'123456' – Mulagala 2014-11-08 08:10:49

相關問題