MongoDB - 获取集合的每个值的每个字段的计数摘要

MongoDB - Get a summary of the count for each field for each value of a collection

我想获得集合中每个值的每个字段的计数摘要。

示例:

集合可能包含以下文档架构和值:

{
    shop: A, B, C, D
    fruits: banana, apple, kiwi
    region: north, south, west, east
}

目标: 我想得到一个文档作为结果,每个值的计数如下:

{
    shop: {
        A: 2,
        B: 5,
        C: 3,
        D: 1
    },
    fruits: {
        banana: 3,
        apple: 2,
        kiwi: 1
    }
    ...
}

mongo 怎么可能?

感谢您的帮助!

  • $facet 分隔所有三个字段的结果
  • $project shop 仅字段
  • $unwind解构shop数组
  • $group 通过 shop 得到计数
  • $project 仅将键显示为 shop,将值显示为 count
  • 其他 2 个数组 fruitsregion
  • 的过程相同
  • $arrayToObject 将键值数组转换为对象格式
db.collection.aggregate([
  {
    $facet: {
      shop: [
        { $project: { shop: 1 } },
        { $unwind: "$shop" },
        { $group: { _id: "$shop", count: { $sum: 1 } } },
        { $project: { _id: 0, k: "$_id", v: "$count" } }
      ],
      fruits: [
        { $project: { fruits: 1 } },
        { $unwind: "$fruits" },
        { $group: { _id: "$fruits", count: { $sum: 1 } } },
        { $project: { _id: 0, k: "$_id", v: "$count" } }
      ],
      region: [
        { $project: { region: 1 } },
        { $unwind: "$region" },
        { $group: { _id: "$region", count: { $sum: 1 } } },
        { $project: { _id: 0, k: "$_id", v: "$count" } }
      ]
    }
  },
  {
    $project: {
      shop: { $arrayToObject: "$shop" },
      fruits: { $arrayToObject: "$fruits" },
      region: { $arrayToObject: "$region" }
    }
  }
])

Playground