猫鼬findbyIdAndUpdate-如何使用另一个数组字段中的总和来更新一个字段

时间:2020-06-06 18:47:00

标签: node.js mongodb mongoose

这就是我的文档的样子

"donator": [
        {
            "_id": "5edbd7d182af1f5aceab62bb",
            "donatorName": "Niki",
            "donationValue": 5000000
        },
        {
            "_id": "5edbd7d182af1f5aceab62bc",
            "donatorName": "Brian",
            "donationValue": 5000000
        }
    ],

"currentValue" : 1000000

我从捐赠者数组中的donationValue sum中获取了currentValue:

donator.reduce((a, { donationValue }) => a + donationValue,0);

我想通过在 donator 数组中添加新对象来更新文档,并在数据更新时自动更新 currentValue 字段。

我尝试使用聚合

MyCollection.findByIdAndUpdate(id, [
      {
        $set: req.body,
        $set: { currentValue: { $sum: { $sum: donator.donationValue } } },
      },
    ]);

1 个答案:

答案 0 :(得分:0)

清理输入内容而不直接使用req.body是个好习惯。

所以我们说

const donator = sanitizeDonator(req.body)

然后您可以添加donator并更新currentValue,如下所示。

请注意,更新查询不会自动生成捐赠者上的_id,因此它必须存在于donator对象中。

MyCollection.findByIdAndUpdate(id, [
  {
    $set: {
      donator: {
        $concatArrays: ["$donator", [donator]] // adding donator to the last element
      }
    }
  }, {
    $set: {
      currentValue: {
        $reduce: {
          initialValue: 0,
          input: "$donator",
          in: {
            $add: ["$$this.donationValue", "$$value"]
          }
        }
      }
    }
  }
]);

相关API $concatArrays$reduce