Mongodb Update子文档的值与子文档匹配且不更改其他字段

问题描述

我有一个这样的模式

{
    "_id": "5f86da4b5bb9a62742371409","status" : true,"doc": [
      {
        "_id": "5f86cacbe4d7c423f21faf50","a": 4,"b": null
      },{
        "_id": "5f86cb01a1ca5124063299c1","a": 6,"b": null

      }
    ]
}

我有一个

形式的更新

[
      {
        "_id": "5f86cacbe4d7c423f21faf50","b": 90
      },"b": 45

      }
    ]

我如何更新收藏集以使它像这样结束?

{
    "_id": "5f86da4b5bb9a62742371409","b": 45

      }
    ]
}

基本上,我只想使用特定键来更新子文档(保持其他键不变)

解决方法

您可以在MongoDB 4.2中使用update with aggregation pipeline

  • $map遍历数组doc的循环,并在内部遍历updateDocs数组,它将返回匹配的b,然后$mergeObjects将返回更新的文档,
let updateDocs = [
  { "_id": mongoose.Types.ObjectId("5f86cacbe4d7c423f21faf50"),"b": 90 },{ "_id": mongoose.Types.ObjectId("5f86cb01a1ca5124063299c1"),"b": 45 }
];

db.collection.updateMany({},[
  {
    $set: {
      doc: {
        $map: {
          input: "$doc",as: "d",in: {
            $mergeObjects: [
              "$$d",{
                $reduce: {
                  input: updateDocs,initialValue: {},in: {
                    $cond: [
                      { $eq: ["$$this._id","$$d._id"] },{ b: "$$this.b" },"$$value"
                    ]
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
]
)

Playground