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

MongoDB聚合$bucket阶段如何获取区间上边界?

获取$bucket分组的区间上边界

可以通过在聚合管道中添加额外阶段,利用数组操作符从boundaries数组中匹配当前分组_id对应的上边界,具体实现如下:

方法实现

在原有的$bucket阶段之后,新增$addFields阶段,通过两步计算上边界:

  1. 用$indexOfArray定位当前分组_id在boundaries数组中的索引
  2. 用$arrayElemAt取出索引+1位置的元素,即为对应区间的上边界
  3. 针对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:52:49