【问题标题】:Get count of records with field existing in MongoDB获取 MongoDB 中存在字段的记录数
【发布时间】:2020-11-25 06:45:41
【问题描述】:

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

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

我想获得具有item1item2item3 字段的记录计数(它们不需要是动态的。我只有一组有限的项目)。我需要的是计数以下列方式存在的字段的记录:

{ "item1": 3, "item2": 2, "item3": 1 }

为了获得item1 的计数,我这样做:

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

有没有一种简单的方法可以在单个查询中汇总所有三个项目的计数?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework aggregate


    【解决方案1】:

    您可以使用$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 }
        }
    ])
    

    Mongo Playground

    【讨论】:

    • 这太棒了!有没有一种简单的方法可以排除空键,比如item5: {}
    • @YedhuKrishnan 当然,你可以试试这个方法(附加$match):mongoplayground.net/p/2Y4RD0mgTZd
    • 抱歉打扰了。我有最后一个问题。我可以获得按单个字段分组的相同计数数组吗?例如,如果我有一个名为 itemGroup 的字段,其值为 1、2、3 等。我可以按 itemGroup 计算计数吗?
    • 不确定我是否理解,但如果你想遵循这种方法,那么只需匹配 root.k 以过滤掉所有不同于 itemGroup 的键
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 2014-12-04
    • 2018-02-05
    相关资源
    最近更新 更多