MongoDB分组聚合咨询:基于稻米平均尺寸分组计数的实现方法
修正后的MongoDB聚合管道方案
你的代码存在多处语法和逻辑错误,以下是符合需求的正确实现:
方案一:使用$bucket阶段(推荐,更直观)
$bucket可直接根据数值区间分组,适配你的分组规则:
db.rice.aggregate([ // 计算每个稻米的两个产地尺寸平均值 { $addFields: { average_size: { $divide: [{ $add: ["$size_A", "$size_B"] }, 2] } } }, // 按平均尺寸区间分组并统计数量 { $bucket: { groupBy: "$average_size", boundaries: [0, 3, 10, Infinity], default: "其他", output: { num_rice: { $sum: 1 }, // 若需保留组内稻米标题,可添加此行 // titles: { $push: "$title" } } } }, // 按分组区间升序排序(可选) { $sort: { _id: 1 } } ])
方案二:使用$cond生成分组标识后分组
如果需要自定义分组名称,可先通过$cond生成分组标签再统计:
db.rice.aggregate([ // 计算平均尺寸并生成分组标签 { $addFields: { average_size: { $divide: [{ $add: ["$size_A", "$size_B"] }, 2] }, group_tag: { $cond: [ { $lt: ["$average_size", 3] }, "第一组(平均尺寸<3)", { $cond: [ { $lt: ["$average_size", 10] }, "第二组(3≤平均尺寸<10)", "第三组(平均尺寸≥10)" ] } ] } } }, // 按分组标签统计数量 { $group: { _id: "$group_tag", num_rice: { $sum: 1 }, // 可选:计算组内平均尺寸的均值 avg_group_size: { $avg: "$average_size" } } }, // 按分组排序 { $sort: { _id: 1 } } ])
关键修正说明:
- 尺寸平均值计算:需用
$add求和后除以2,$avg不能直接接收字段数组参数 - 分组逻辑:通过
$bucket或$cond实现区间分组,而非错误设置_id数组 - 数量统计:
$group阶段用$sum:1计数,$count是独立聚合阶段,不能用于$group内部 - 语法规范:聚合管道为数组结构,每个阶段必须是独立对象
内容的提问来源于stack exchange,提问作者Chloe Xu
相关产品推荐
相关产品推荐

