2014-09-03 22 views
0

存在编写一个查询,其返回值keyword4如何经常出现在我的收藏田间labelMongoDB的算我再怎么经常是一个值的集合

{ 
    "_id" : ObjectId("54071d4312bf9ee0d67f7cf8"), 
    "id" : "2", 
    "list" : [ 
     { 
      "id" : 60, 
      "label" : "keyword3", 
      "pos" : 1 
     }, 
     { 
      "id" : 89, 
      "label" : "keyword4", 
      "pos" : 2 
     }, 
     { 
      "id" : 49, 
      "label" : "keyword4", 
      "pos" : 3 
     } 
     ] 
}, 
{ 
    "_id" : ObjectId("5407sfkjsvnsvree9ee0d67f7cf8"), 
    "id" : "3", 
    "list" : [ 
     { 
      "id" : 60, 
      "label" : "keyword3", 
      "pos" : 1 
     }, 
     { 
      "id" : 89, 
      "label" : "keyword4", 
      "pos" : 2 
     }, 
     { 
      "id" : 49, 
      "label" : "keyword4", 
      "pos" : 3 
     } 
     ] 
}, 
... 

感谢。

+0

你的问题是什么?如果我们能为你做你的任务?你必须向我们展示你到目前为止所尝试的以及你卡在哪里。 – honk 2014-09-03 16:23:00

回答

2

你在这里讨论的是“聚合结果”,你基本上使用aggregation framework

这些步骤基本上是匹配包含您想要的值的文档,将数组内容过滤为仅匹配这些匹配项,然后为该字段计算该值的出现次数。主要运营商这里有$match这需要查询参数,如.find()确实,$unwind它允许你用数组的元素工作,$group来完成实际的“聚集”,或者确实是“计数”为你的元素:

db.collection.aggregate([ 
    // Match the documents to reduce what you are processing 
    { "$match": { "list.label": "keyword4" } }, 

    // Unwind the array to de-normalize or "un-join" 
    { "$unwind": "$list" }, 

    // Match again to "filter" the array content 
    { "$match": { "list.label": "keyword4" } }, 

    // Group your final results 
    { "$group": { 
     "_id": "$list.label", 
     "count": { "$sum": 1 } 
    }} 
]) 

这里的$sum运算符将“求和”它作为参数提供的值。在这种情况下,您可以提供1的基本值,以表示每次匹配事件的计数增量。

此外,这里有两个“阶段”$match阶段的原因是因为MongoDB的工作原理和他们分开的事情。第一阶段的目的是匹配符合条件的“文件”。这与.find()的结果基本相同,因为您是匹配文档而不是数组的子文档。声明只是说这个“包含”符合条件的元素。

第二阶段在“$unwind”之后被处理,集合中的其余文档现在看起来好像对数组中存在的每个元素“复制”,因此该数组元素不再是一个数组,但来自数组内容的单个字段或“子文档”。

现在作为单个文档,第二个$match将“过滤”任何不符合条件的元素。所以现在只有与指定值匹配的“list.label”值。您不想忽略第一个$match,因为这意味着要处理集合中每个文档的$unwind,而不管数组元素是否包含匹配项。这意味着你不会通过处理不可能计入结果的东西来做“不必要的”工作。

为了更好地理解和介绍如何使用聚合框架,文档中的SQL to aggregation mapping page值得关注,至少对于一些常见的示例,如果您习惯使用SQL表单,则更直接。

此外,通常熟悉一般的aggregation operators并了解它们的功能是个好主意。这是一个有用的工具,基本上是一般查询的对应物。所以非常值得学习,并且使用得很好。c

相关问题