首页 > 解决方案 > MongoDB 使用同一对象数组的另一个字段的值更新数组对象

问题描述

我有一个如下集合:

{
    _id: asilu92834,
    services: [
        {
            chargeAmount: 10,
            calculatedChargeAmount: 5,
        },
        {
            chargeAmount: 20,
            calculatedChargeAmount: 15,
        }
    ]
}

我想要做的是用它的对象的计算的ChargeAmount 字段的值来更新chargeAmount 字段。更新后的文档应如下所示:

{
    _id: asilu92834,
    services: [
        {
            chargeAmount: 5,
            calculatedChargeAmount: 5,
        },
        {
            chargeAmount: 15,
            calculatedChargeAmount: 15,
        }
    ]
}

我知道如何在阅读每个文档后更新它,然后使用 forEach 一次更新一个。那不是我想要的。我知道 updateMany() 函数接受聚合管道,在这些管道中你应该能够做类似的事情

[
    { $set: { "value1": "$value2"}}
]

但是由于chargeAmount和计算的ChargeAmount嵌套在对象数组中,我试图这样做

db.collection.updateMany(filter, [
    {
      $set: {
        'services.$[].chargeAmount': '$services.$[].calculatedChargeAmount'
      }
    }
  ]);

我收到错误消息说 FieldPath 字段名称可能不以“$”开头。不可能做我想要达到的目标吗?如果是这样怎么办?

标签: mongodbmongoosemongodb-queryaggregation-framework

解决方案


试试这个:

    db.collection.updateMany({"services._id":req.user.id},
                       {$set: {"services.$.chargeAmount" :'services.$.calculatedChargeAmount'}},
                      function (error, success) {
                        if(error)
                        {
                          console.log(error);
                        }
                        else {
 console.log('success');
}
})

请记住,这里的 id 是 mongoDB 中数组服务的 _id。它必须自动创建一个_id。


推荐阅读