在MongoDB中获取具有现有字段记录的计数

3

我有一个MongoDB集合,其中记录的格式如下:

[
  { "item1": { "a": 1 }, "item2": { "a": 2 } },
  { "item1": { "a": 3 }, "item3": { "a": 4 } },
  { "item1": { "a": 5 }, "item2": { "a": 6 } },
]

我想获取具有字段item1,item2和item3的记录计数(它们不需要是动态的。我只有有限的一组项目)。 我需要的是具有以下方式存在字段的记录计数:
{ "item1": 3, "item2": 2, "item3": 1 }

要获取item1的计数,我会这样做:

db.collection.find({ "item1": { $exists: true }}).count()

有没有一种简单的方法来在一个查询中聚合这三个项目的数量?

1个回答

3
你可以使用 $objectToArray$arrayToObject 动态计数你的键:
db.collection.aggregate([
    {
        $project: { root: { $objectToArray: "$$ROOT" } }
    },
    {
        $unwind: "$root"
    },
    {
        $group: { _id: "$root.k", total: { $sum: 1 } }
    },
    {
        $group: { _id: null, obj: { $push: { k: "$_id", v: "$total" } } }
    },
    {
        $replaceRoot: { newRoot: { $arrayToObject: "$obj" } }
    },
    {
        $project: { _id: 0 }
    }
])

{{link1:Mongo Playground}}


太好了!有没有一种简单的方法来排除空键,比如 item5: {} - Yedhu Krishnan
1
@YedhuKrishnan 当然可以,你可以尝试这种方法(附加 $match):https://mongoplayground.net/p/2Y4RD0mgTZd - mickl
不好意思打扰了,我有最后一个问题。我能否通过单个字段进行分组,得到相同的计数数组呢?例如,如果我有一个名为itemGroup的字段,其值为1、2、3等,那么我能否按itemGroup每个值的数量统计呢? - Yedhu Krishnan
1
不确定我是否理解,但如果您想采用这种方法,请通过“root.k”进行匹配,以过滤掉与“itemGroup”不同的所有键。 - mickl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接