如何在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
相关产品推荐
相关产品推荐

