MongoDB按海拔区间分组聚合并汇总面积字段的需求
如何按指定海拔区间分组并汇总MongoDB文档的area属性?
嘿,我来帮你搞定这个MongoDB聚合需求!针对你的分组规则和输出要求,我们可以用MongoDB的$bucket聚合阶段来精准实现区间分组,再配合简单的字段处理来适配你的格式。
完整聚合管道代码
db.collection.aggregate([ // 处理elevation为null的情况,确保能被正确归类 { $addFields: { elevation: { $ifNull: ["$elevation", -1] } } }, // 核心:按海拔区间分组并计算汇总值 { $bucket: { groupBy: "$elevation", boundaries: [-Infinity, 0, 1501, 3001, Infinity], output: { count: { $sum: 1 }, summarizedArea: { $sum: "$area" }, // 生成对应的区间文本名称 interval: { $switch: { branches: [ { case: { $lt: ["$elevation", 0] }, then: "<0" }, { case: { $and: [{ $gte: ["$elevation", 0] }, { $lt: ["$elevation", 1501] }] }, then: "0-1500" }, { case: { $and: [{ $gte: ["$elevation", 1501] }, { $lt: ["$elevation", 3001] }] }, then: "1501-3000" }, { case: { $gte: ["$elevation", 3001] }, then: ">3000" } ], default: "<0" } } } } }, // 调整输出格式,移除不需要的_id字段 { $project: { _id: 0, interval: 1, count: 1, summarizedArea: 1 } } ])
逐阶段解释
$addFields处理空值
你的数据里有一个elevation为null的文档,我们用$ifNull把它转换成-1,这样它会被自动归到<0的区间里,避免因为空值无法匹配任何区间而被分到默认组。$bucket区间分组
这是实现需求的核心步骤:groupBy: "$elevation":指定按海拔字段分组boundaries:定义了区间的分界点,完美对应你的四个分组规则:[-Infinity, 0)→<0组[0, 1501)→0-1500组[1501, 3001)→1501-3000组[3001, Infinity)→>3000组
output里我们完成三个关键计算:count: { $sum: 1 }:统计每个组的文档数量summarizedArea: { $sum: "$area" }:汇总每个组的area总和- 用
$switch根据海拔值生成对应的区间文本名称,确保输出的interval字段完全符合你的预期。
$project调整输出格式$bucket会自动生成一个_id字段(值为区间的下界),我们用$project移除这个字段,只保留需要的interval、count和summarizedArea,让输出完全匹配你给出的示例格式。
最终输出结果
针对你提供的原始数据,运行上述聚合后会得到:
[ { "interval": "<0", "count": 1, "summarizedArea": 5 }, { "interval": "0-1500", "count": 1, "summarizedArea": 12 }, { "interval": "1501-3000", "count": 2, "summarizedArea": 60 } ]
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

