【问题标题】:How to retrieve the bucket boundaries when using mongo's $bucket aggregation?使用 mongo 的 $bucket 聚合时如何检索存储桶边界?
【发布时间】:2018-10-03 15:06:42
【问题描述】:

我收集了 200,000 多条记录,其中包括一个浮点字段 amountAwarded(例如 12345.67、2342、22 等)。我正在使用 MongoDB 根据以下边界将这些聚合到存储桶中:

amountAwarded: [
        {
            $bucket: {
                groupBy: '$amountAwarded',
                boundaries: [0, 10000, 50000, 100000, 1000000, Infinity],
                output: {
                    count: { $sum: 1 }
                }
            }
        }
    ]

这按预期工作,我得到这个输出:

{
  "amountAwarded": [
    {
      _id: 0,
      count: 269
    },
    {
      _id: 10000,
      count: 67
    },
    // etc
  ]
}

我真正想要的是在输出中引用桶边界,例如:

{
  "amountAwarded": [
    {
      _id: 0,
      count: 269,
      lowerBound: 0,
      upperBound: 9999
    }
  ]
}

这意味着我可以在前端构建一个显示存储桶的列表(例如£0 - £9999)。

我最接近的是将$min: "$amountAwarded"(和等效的$max)添加到output,这为我提供了分桶记录中该字段的上限/下限。这是不对的,因为数字显然来自数据(例如8762)而不是存储桶边界。

是否可以在聚合管道中引用匹配的存储桶边界,或者我必须在构面完成后手动构造它?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    你自己定义你的界限,所以你可以在下一阶段使用indexOfArray和arrayElemAt的组合来addFields。

    类似这样的:

    db.collection.aggregate([
    {
        $bucket: {
            groupBy: '$amountAwarded',
            boundaries: [0, 10000, 50000, 100000, 1000000, Infinity],
            output: {
                count: { $sum: 1 }
            }
        }
    },
    { $addFields: {
          lowerBound: "$_id",
          upperBound: { $arrayElemAt: [ 
              [0, 10000, 50000, 100000, 1000000, Infinity], 
              { $add: [
                  { $indexOfArray: [
                      [0, 10000, 50000, 100000, 1000000, Infinity], "$_id"
                  ] }, 
                  1
              ] }
          ] }
    } }
    ])
    

    【讨论】:

    • 太棒了——我没想到只是addFields。这符合我的预期——谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    相关资源
    最近更新 更多