You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MongoDB中按指定字段统计数量并生成指定格式结果

解决方案

你可以通过两次$group结合$arrayToObject来实现需求,以下是完整的聚合查询:

db.Listings.aggregate([
    // 保留你的过滤条件,这里假设是筛选存在listingID的文档
    { $match: { listingID: { $exists: true } } },
    // 第一步:按category分组,统计每个分类的数量
    {
        $group: {
            _id: "$listingData.category",
            count: { $sum: 1 }
        }
    },
    // 第二步:收集所有分类统计,同时计算总数量
    {
        $group: {
            _id: null,
            categoryCounts: { $push: { k: { $concat: ["$_id", "Count"] }, v: "$count" } },
            ListingsCount: { $sum: "$count" }
        }
    },
    // 第三步:将分类统计数组转为键值对,合并总数量字段
    {
        $replaceRoot: {
            newRoot: {
                $mergeObjects: [
                    { $arrayToObject: "$categoryCounts" },
                    { ListingsCount: "$ListingsCount" }
                ]
            }
        }
    }
])

执行结果

针对你的示例数据,会输出:

{ "resedetialCount" : 2, "officeCount" : 1, "ListingsCount" : 3 }

说明

  • 第一次$group:按listingData.category分组,得到每个分类的统计数
  • 第二次$group:
    • 用$push把每个分类的键名(拼接Count后缀)和统计数组成数组
    • 用$sum累加所有分类的数量得到总条数
  • $replaceRoot + $arrayToObject:把分类统计数组转为对象字段,再和总数字段合并成最终结果

注意:你的示例文档里category拼写是resedetial,而期望结果里是resedential,如果是拼写错误,可以在第一次$group的_id里用$replaceOne修正,比如:

_id: { $replaceOne: { input: "$listingData.category", find: "resedetial", replacement: "resedential" } }

内容的提问来源于stack exchange,提问作者shdyyy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:31:15