繁体   English   中英

MongoDB 嵌套映射聚合对数组元素求和

[英]MongoDB nested map aggregation to sum a array element

我有以下数据:

[
  {
    "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 问题/答案,但无法弄清楚为什么这不会产生结果。

使用嵌套的$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 命令是什么?

如果可能,请考虑重构您的架构。 目前,高度嵌套的模式和将数字存储为文本给查询组合带来了高复杂性。 尽管如此,您仍然可以继续使用分层的$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
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
])

蒙戈游乐场

您当前的聚合不会创建一个数组,而是一个数组的数组,这与$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"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
])

工作示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM