频率表生成 - MongoDB

Dio*_*Dan 1 mongodb mongodb-query aggregation-framework

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

{
  "_id": 1,
  genre: [
    "Fantasy",
    "Crime",
    "Drama"
  ]
}
{
  "_id": 2,
  genre: [
    "Drama"
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

谢谢!

Nei*_*unn 7

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

一旦阵列"解开",你就可以处理你的$group:

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

这给出了如下输出:

{ "_id" : "Drama", "count" : 2 }
{ "_id" : "Crime", "count" : 1 }
{ "_id" : "Fantasy", "count" : 1 }
Run Code Online (Sandbox Code Playgroud)

_id提供$group的是"关键"要组上,你的情况,这是"流派"被称为它的"价值"通过与前缀$"$流派".在$sum简单地加起来的1值在每种情况下,通常是你怎么算.

SQL to Aggregation映射图中显示了几个示例,它不仅是那些习惯于SQL的有用指南,而且还有一般的实际使用示例.