MongoDB 聚合如何对对象数组中的值求和

问题描述 投票:0回答:1

我正在尝试将聚合管道内的对象内的两个金额相加。

这是我的沙箱:https://mongoplayground.net/p/LIvksL-UGur

文件:

[
  {
    "result": {
      "invoices": [
        {
          "product": "baseball",
          "amount": 4,
          "tax": 1
        },
        {
          "product": "basketball",
          "amount": 10,
          "tax": 2
        }
      ]
    }
  }
]

我希望结果是:

[
  {
    "result": {
      "invoices": [
        {
          "product": "baseball",
          "amount": 4,
          "tax": 1,
          "total": 5
        },
        {
          "product": "basketball",
          "amount": 10,
          "tax": 2,
          "total": 12
        }
      ]
    }
  }
]

这是我认为可行的:

db.collection.aggregate([
  {
    $set: {
      "result.invoices": {
        "total": "$result.invoices.amount + $result.invoices.tax"
      }
    }
  }
])

总数是空的,因为它试图添加两个数组,我通过尝试这个来理解:

db.collection.aggregate([
  {
    $set: {
      "result.invoices": {
        "total": "$result.invoices.amount"
      }
    }
  }
])

...这给出了这个:

[
  {
    "result": {
      "invoices": [
        {
          "product": "baseball",
          "amount": 4,
          "tax": 1,
          "total": [
             4,
             10
           ]
        },
        {
          "product": "basketball",
          "amount": 10,
          "tax": 2,
          "total": [
             4,
             10
           ]
        }
      ]
    }
  }
]

我该如何做才是正确的?

注意:我意识到这是一个非常简单的例子,我可以在得到结果后添加计算。这只是说明了我正在尝试解决的一个更复杂的问题。

mongodb aggregate
1个回答
0
投票

为了达到为发票数组中的每个项目添加金额和税费的预期结果,您需要在 MongoDB 聚合管道的 $addFields 或 $set 阶段中使用 $map 运算符。该运算符允许您转换数组中的每个项目。

这是修改后的聚合管道,应该适合您的场景:

db.collection.aggregate([
  {
    $set: {
      "result.invoices": {
        $map: {
          input: "$result.invoices",
          as: "invoice",
          in: {
            product: "$$invoice.product",
            amount: "$$invoice.amount",
            tax: "$$invoice.tax",
            total: { $add: ["$$invoice.amount", "$$invoice.tax"] }
          }
        }
      }
    }
  }
])

说明:

  • $map:处理发票数组中的每一项。
  • input: "$result.invoices": 指定要处理的数组。
  • as:“invoice”:表示数组中每一项的临时变量。
  • in:定义每个项目的转换。在这里,我们保留现有字段(产品、金额、税费)并添加新字段总计,即每张发票的金额和税费之和。

此管道将为发票数组中的每个对象添加一个总计字段,其中包含金额和税金的总和。

© www.soinside.com 2019 - 2024. All rights reserved.