2015-03-25 86 views
1

這是一個很簡單的問題,我找遍了所有,但could'nt找到答案MongoDB的陣列文檔搜索

我只有

{ 
"_id" : 1, 
    "name" : { 
     "first" : "John", 
     "last" : "Backus" 
    }, 
"awards" : [ 
     { 
      "award" : "W.W. McDowell Award", 
      **"year" : 1967,** 
      "by" : "IEEE Computer Society" 
     }, 
     { 
      "award" : "Draper Prize", 
      **"year" : 1967,** 
      "by" : "National Academy of Engineering" 
     }, 
     { 
      "award" : "National Medal of Science", 
      "year" : 1975, 
      "by" : "National Science Foundation" 
     } 
    ] 
}, 
{ 
"_id" : 2, 
    "name" : { 
     "first" : "John", 
     "last" : "McCarthy" 
    }, 
"awards" : [ 
     { 
      "award" : "Turing Award", 
      "year" : 1971, 
      "by" : "ACM" 
     }, 
     { 
      "award" : "Kyoto Prize", 
      **"year" : 1967,** 
      "by" : "Inamori Foundation" 
     }, 
     { 
      "award" : "National Medal of Science", 
      "year" : 1990, 
      "by" : "National Science Foundation" 
     } 
    ] 
}, 

所有我需要的是,一直是所有獎項在1967年贏得了!

,我試圖

,我只得到

"_id" : 1, 
"awards" : [ 
     { 
      "award" : "W.W. McDowell Award", 
      "year" : 1967, 
      "by" : "IEEE Computer Society" 
     }, 

], 

,但我需要在所有的文件,找到(在firsdt一個有兩個這樣totalyy 3樣

{ 
"_id" : 1, 
    "awards" : [ 
      { 
       "award" : "W.W. McDowell Award", 
       "year" : 1967, 
       "by" : "IEEE Computer Society" 
      }, 
      { 
       "award" : "Draper Prize", 
       **"year" : 1967,** 
       "by" : "National Academy of Engineering" 
      } 
    ] 
}, 
{ 
    "_id" : 2, 
    "award":[{ 
       "award" : "Kyoto Prize", 
       "year" : 1967, 
       "by" : "Inamori Foundation" 
      } 
    ] 
} 

我嘗試使用$all,但無法得到結果。我希望我的明確 是的,我正在使用BIOS的例子。 這一定很簡單,我正在做短暫的動作 請幫忙。

+0

我想你應該檢查這個http://stackoverflow.com/questions/21623979/mongodb-aggregation-framework-match-by-nested-documents 或找到更多關於mongo聚合。 – Yogesh 2015-03-25 09:46:06

+0

我閱讀http://docs.mongodb.org/manual/tutorial/query-documents/#match-a-field-in-the-embedded-document-using-the-array-index但這個例子沒有多重數組中的值 – 2015-03-25 09:50:24

回答

1

您必須使用aggregation framework,因爲$僅指第一個匹配項。在你的情況,以下可能的工作:

db.bios.aggregate([ 
    { $match : {"awards.year":1967} }, 
    { $unwind : "$awards"}, 
    { $match : {"awards.year" :1967} } 
]); 

屈服

{ 
     "_id" : 1, 
     "name" : { 
       "first" : "John", 
       "last" : "Backus" 
     }, 
     "awards" : { 
       "award" : "W.W. McDowell Award", 
       "year" : 1967, 
       "by" : "IEEE Computer Society" 
     } 
} 
{ 
     "_id" : 1, 
     "name" : { 
       "first" : "John", 
       "last" : "Backus" 
     }, 
     "awards" : { 
       "award" : "Draper Prize", 
       "year" : 1967, 
       "by" : "National Academy of Engineering" 
     } 
} 
{ 
     "_id" : 2, 
     "name" : { 
       "first" : "John", 
       "last" : "McCarthy" 
     }, 
     "awards" : { 
       "award" : "Kyoto Prize", 
       "year" : 1967, 
       "by" : "Inamori Foundation" 
     } 
} 

正如你所看到的,將會複製該文件(所以約翰·巴庫斯的文檔返回兩次)的其餘部分,但你可以通過添加一個$group來改變,例如

db.bios.aggregate([ { $match : {"awards.year":1967} },  
    { $unwind : "$awards"},  
    { $match : {"awards.year" :1967} }, 
    { $group : { _id : "$_id", "awards" : { $push : "$awards" } } } 
]).pretty(); 

但是有很多方法可以做到這一點,所以我建議您深入研究文檔以獲取所需的投影。

+0

非常感謝!我需要徹底地通過聚合。 – 2015-03-25 10:04:52

+0

謝謝我現在可以通過添加$ project和$ sort來找到確切的。找到確切的元素後,有沒有辦法更新它? II是什麼如果我想在獎勵數組中添加一個新項目,其中name.first = john? – 2015-03-26 09:54:55