【问题标题】:Frequency Table Generation - MongoDB频率表生成 - MongoDB
【发布时间】:2019-07-02 02:06:17
【问题描述】:

我需要在 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"}
      }
  } 
])

这并没有按预期工作,因为它只是从每个文档中添加了流派数组。谁能指出我正确的方向?我应该使用聚合框架吗?

谢谢!

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    在聚合框架中处理数组时,您通常需要做的是使用$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 }
    

    提供给$group_id 是您要分组的“键”,在您的情况下,这是“流派”,称为“值”,前缀为$“$genre” . $sum 只是将每次出现的值相加,这通常是您的计数方式。

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

    【讨论】:

    • 感谢您将我推向正确的方向。 $unwind 让我走上了正确的道路,您展示的示例非常有用。其他人注意。我不得不修改您的答案以获得所需的结果(shell 似乎不喜欢前导键值对的“”。例如“$unwind”是 $unwind)。
    • @DiodeDan shell 对所示的语法没有问题,而且我发布的几乎所有内容都是工作代码的完整剪切/粘贴。我想你会发现你实际上在转录中犯了一个错误。 shell 不需要引用,但这是有效的 JSON 格式表示。我以这种方式发布,以便其他人可以获取 JSON 并将其解析为他们自己语言的本机数据结构。
    • 感谢输入,我不知道
    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 2016-04-23
    • 1970-01-01
    • 2012-06-24
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多