MongoDB嵌套Map聚合来对数组元素求和

qpgpyjmq  于 2022-12-22  发布在  Go
关注(0)|答案(2)|浏览(142)

我有以下数据:

[
  {
    "result": {
      "events": [
        {
          "amount": [
            [
              1623224700000,
              "33333333"
            ],
            [
              1623224760000,
              "33333333"
            ],
            [
              1623224820000,
              "33333334"
            ]
          ],
          
        }
      ],
      
    }
  }
]

amount中,第二个元素(str)是我需要求和的数量。
我的渠道:

db.collection.aggregate([
  {
    $addFields: {
      "amount_sum": {
        $sum: {
          $map: {
            input: "$result.events",
            as: "events",
            in: {
              $map: {
                input: "$events",
                as: "event",
                in: {
                  $toInt: {
                    $last: "$event.amount"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
])

输出:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "amount_sum": 0,
    "result": {
      "events": [
        {
          "amount": [
            [
              1.6232247e+12,
              "33333333"
            ],
            [
              1.62322476e+12,
              "33333333"
            ],
            [
              1.62322482e+12,
              "33333334"
            ]
          ]
        }
      ]
    }
  }
]

我已经搜索了每个(嵌套的)$map、$reduce question/answer,但不明白为什么没有结果。
使用嵌套的$unwind(见下文)可以得到所需的结果,但我需要向原始文档添加一个字段。

db.collection.aggregate([
  {
    $unwind: "$result.events"
  },
  {
    $unwind: "$result.events.amount"
  },
  {
    $addFields: {
      amount_sum: {
        $sum: {
          $toInt: {
            $last: "$result.events.amount"
          }
        }
      }
    }
  },
  {
    $group: {
      _id: {
        id: "$_id"
      },
      sum_amount: {
        $sum: "$amount_sum"
      }
    }
  }
])

输出:

[
  {
    "_id": {
      "id": ObjectId("5a934e000102030405000000")
    },
    "sum_amount": 100000000
  }
]

我在这里遗漏了什么神奇的MongoDB命令?

vohkndzv

vohkndzv1#

当前聚合不会创建数组,而是创建数组的数组,这与$sum运算符不兼容。
你可以这样重构它:

db.collection.aggregate([
  {
    $set: {
      "amount_sum": {
        $sum: {
          $first: {
            $map: {
              input: "$result.events",
              as: "event",
              in: {
                $map: {
                  input: "$$event.amount",
                  as: "amount",
                  in: {
                    $toInt: {
                      $last: "$$amount"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
])

Working example

7cjasjjr

7cjasjjr2#

如果可能,请考虑重构方案。目前,高度嵌套的方案和将数值存储为文本会使查询合成变得非常复杂。不过,您仍然可以继续使用分层的$sum$map来实现所需的功能。

db.collection.aggregate([
  {
    $addFields: {
      "amount_sum": {
        $sum: {
          "$map": {
            "input": "$result.events",
            "as": "e",
            "in": {
              $sum: {
                "$map": {
                  "input": "$$e.amount",
                  "as": "a",
                  "in": {
                    $toInt: {
                      "$arrayElemAt": [
                        "$$a",
                        1
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
])

Mongo Playground

相关问题