2015-03-25 90 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