MongoDB聚合$bucket阶段如何获取区间上边界?
获取$bucket分组的区间上边界
可以通过在聚合管道中添加额外阶段,利用数组操作符从boundaries数组中匹配当前分组_id对应的上边界,具体实现如下:
方法实现
在原有的$bucket阶段之后,新增$addFields阶段,通过两步计算上边界:
- 用
$indexOfArray定位当前分组_id在boundaries数组中的索引 - 用
$arrayElemAt取出索引+1位置的元素,即为对应区间的上边界 - 针对
default分组(_id为"Other"),可自定义上边界的显示内容
修改后的聚合代码
db.artists.aggregate([ { $bucket: { groupBy: "$year_born", boundaries: [1840, 1850, 1860, 1870, 1880], default: "Other", output: { "count": { $sum: 1 }, "artists": { $push: { "name": { $concat: ["$first_name", " ", "$last_name"] }, "year_born": "$year_born" } } } } }, { $addFields: { "upper_bound": { $cond: { if: { $eq: ["$_id", "Other"] }, then: "无上限", // 可根据需求自定义 else: { $arrayElemAt: [ [1840, 1850, 1860, 1870, 1880], { $add: [{ $indexOfArray: [[1840, 1850, 1860, 1870, 1880], "$_id"] }, 1] } ] } } } } } ])
输出结果
执行后分组会新增upper_bound字段,对应区间上边界:
{ "_id" : 1860, "count" : 2, "artists" : [ { "name" : "Emil Bernard", "year_born" : 1868 }, { "name" : "Joszef Rippl-Ronai", "year_born" : 1861 } ], "upper_bound": 1870 }
补充说明
- 代码中重复了
boundaries数组,若想避免重复,可在管道开头用$addFields将数组定义为变量(MongoDB 4.2+支持),但直接重复数组是最直观的实现方式 default分组的上边界可根据业务需求设置为null、"未知"等自定义值
内容的提问来源于stack exchange,提问作者marc
相关产品推荐
相关产品推荐

