首页 > 解决方案 > 猫鼬聚合直到文档总和等于某个值

问题描述

180在我达到总和并获得_ids之前,我可以使用什么管道来选择所有id 。下面是我已经过滤掉的数据示例。在这种情况下,它应该选择前两项。

[
    {
        "_id": "6048b2b190422d0066d90740",
        "Code": "A0ABI61YH",
        "Amount": 100
    },
    {
        "_id": "6048b3cc7e4b350072424f4c",
        "Code": "A0ABEAXX6",
        "Amount": 100
    },
    {
        "_id": "6048b5167e4b350072424f50",
        "Code": "A0ABCENPD",
        "Amount": 100
    }
]

标签: mongodbmongoose

解决方案


我认为没有任何直接的方法可以实现这一点,如果您真的想尝试,这仅在您的数据大小低于 16MB 时才有效,因为我们要将您的文档分组到数组中的文档中,其次这可能导致性能问题,

  • $group按 null 并将所有文档和必填字段 ( _id, Amount) 分组在result
  • $reduceresult迭代数组 的循环,
    • initialValue声明初始值为Amount0 且result为 []
    • in检查条件,如果 initialValue 的 Amount 小于 180,则连接当前对象的 _id 和 initialValue 的 _ids 使用$concatArrays并求和当前对象的 Amount 和 initialValue 的 Amount,否则返回相同的值
db.collection.aggregate([
  {
    $group: {
      _id: null,
      result: {
        $push: {
          _id: "$_id",
          Amount: "$Amount"
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      result: {
        $reduce: {
          input: "$result",
          initialValue: { Amount: 0, _ids: [] },
          in: {
            $cond: [
              { $lt: ["$$value.Amount", 180] },
              {
                _ids: { $concatArrays: ["$$value._ids", ["$$this._id"]] },
                Amount: { $sum: ["$$value.Amount", "$$this.Amount"] }
              },
              "$$value"
            ]
          }
        }
      }
    }
  }
])

操场


推荐阅读