【问题标题】:MongoDB update array object filed with value of another field of that same object arrayMongoDB 使用同一对象数组的另一个字段的值更新数组对象字段
【发布时间】:2020-09-18 22:05:48
【问题描述】:

我有一个类似如下的集合:

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

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

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

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

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

但由于chargeAmount 和calculatedChargeAmount 嵌套在对象数组中,所以我尝试这样做

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

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

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    试试这个:

        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。

    【讨论】:

    • 这也不起作用。 errro:: "Invalid $addFields :: 由 :: FieldPath 字段名可能不以'$'开头。"
    • 更新了答案!尝试执行那个。请记住,在使用 UpdateMany() 函数时,过滤器在这里很重要。
    • {$set: {"services.$.chargeAmount" :'services.$.calculatedChargeAmount'}} 如果不在聚合管道中,这将不起作用。它使用字符串而不是值设置字段
    • @ReshadHasan 你有聚合的例子吗?
    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 2020-05-08
    • 2013-06-14
    • 2016-04-16
    • 2019-04-18
    • 1970-01-01
    • 2021-07-01
    • 2022-11-01
    相关资源
    最近更新 更多