频率表生成 - MongoDB

时间:2014-07-24 04:05:04

标签: mongodb mongodb-query aggregation-framework

我需要在MongoDB中生成一个简单的频率表。假设我在名为books的集合中有以下文档。

{
  "_id": 1,
  genre: [
    "Fantasy",
    "Crime",
    "Drama"
  ]
}
{
  "_id": 2,
  genre: [
    "Drama"
  ]
}

预期输出为: 幻想:1 犯罪:1 戏剧:2

假设我没有关于什么类型可能的预先形成的概念,我如何让MongoDB检测类型并计算它们?这似乎是聚合框架的工作。

到目前为止,我已经到了这个阶段:

db.books.aggregate([
  {
      $group: {
        _id: null,
        test: {$push: "$genre"}
      }
  } 
])

这不能按预期工作,因为它只是添加每个文档的类型数组。谁能指出我正确的方向?我应该使用聚合框架吗?

谢谢!

1 个答案:

答案 0 :(得分:6)

在聚合框架中处理数组时,通常需要使用$unwind。这会处理数组,并为每个数组成员生成一个新文档。可以将其视为使用SQL JOIN进行“反规范化”。

一旦阵列“解开”,您就可以处理$group

db.collection.aggregate([
    { "$unwind": "$genre" },
    { "$group": {
        "_id": "$genre",
        "count": { "$sum": 1 }
    }}
])

这给出了输出:

{ "_id" : "Drama", "count" : 2 }
{ "_id" : "Crime", "count" : 1 }
{ "_id" : "Fantasy", "count" : 1 }

提供给_id的{​​{1}}是您想要分组的“密钥”,在您的情况下,这是“类型”,称为“值”,前缀为{{1 “$ genre”。 $sum只会为每次出现添加1的值,通常是您的计算方式。

SQL to Aggregation mapping chart显示了几个示例,这不仅是那些习惯于SQL的有用指南,而且还有一般的实际使用示例。