微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。