首页 > 解决方案 > MongoDB:如何根据文档字段计算更新文档字段?

问题描述

我想知道如何对文档字段执行计算,然后根据这些计算更新该文档中的现有字段?

我目前正在使用一种迂回的方式(如下),但我想知道是否有更高效或更直接的方式?

或者,如果可能,拥有一个动态的文档字段(“cumulativeField”),并以下列方式更新:

db.collection
    .aggregate([
        { $match: { arrayField: { $exists: true } } },
        { $addFields: { cumulativeField: { $sum: "$arrayField.number" } } }
        ])
    .forEach(function (x){
        db.collection.updateOne(
          { id: x.id },
          { $set: { cumulativeField: NumberInt(x.cumulativeField) } }
        )})

注意:arrayField = 一个“对象数组”字段,数组中的每个对象都有一个键“数字”,我将其值求和,然后将其作为单个值放入“cumulativeField”字段中。

标签: mongodbaggregation-frameworkmongo-shell

解决方案


MongoDB >= 4.2 支持管道更新,更新可以像聚合一样,聚合结果是文档的新值。

在您的情况下,我认为您只需将代码编写为

updateOne({},
[{ $match: { arrayField: { $exists: true } } },
 { $addFields: { cumulativeField: { $toInt: { $sum: "$arrayField.number" } } } }])

推荐阅读