根据条件 MongoDB 更新多个文档

Update many document based on a condition MongoDB

这是我的架构

{ _id : Number,
  user1: {
   _id : Number, 
   userDetail : {
    userId : Number,
    userResult : String,
   }
  }, 
  user2 : {
   _id : Number, 
   userDetail : {
    userId : Number,
    userResult : String,
   }
  },
 createdAt : Date, 
 updatedAt : Date
}

示例文档如下所示

{
    "_id" : ObjectId("625ebcabcc03685c273b2363"),
    "user1" : {
        "_id" : "625ebc9fcc03685c273b2207",
        "userDetail" : {
            "userId" : 7,
            "userResult" : "won"
        }
    },
    "user2" : {
        "_id" : "625ebc9fcc03685c273b2208",
        "userDetail" : {
            "userId" : 11,
            "userResult" : "lose"
        }
    },
    "createdAt" : ISODate("2022-04-19T13:44:11.781Z"),
    "updatedAt" : ISODate("2022-04-19T13:44:11.781Z")
}

现在我有近1000个这个用户玩过的文档。所以我需要更新所有这些用户的 userId。我怎么能做到这一点。我正在通过

获得所有用户
db.getCollection('matches').find({$or : [{'user1.userDetails.userId' : 7}, 
    {'user2.userDetails.userId' : 7}
]})

通过上面的查询,我得到了 userId 7 播放过的所有文档,现在我需要将 userId 7 更新为 10。我该怎么做。

试试这个

db.getCollection('matches').updateMany({$or : [{"user1.userDetails.userId" : 7}, 
{"user2.userDetails.userId" : 7}]}, { $set: { "user1.userDetails.userId": 10 })

您可以使用 $cond:

db.collection.update({
  $or: [{"user1.userDetail.userId": 7}, {"user2.userDetail.userId": 7}]
},
[
  {
    $set: {
      "user1.userDetail.userId": {
        $cond: [{$eq: ["$user1.userDetail.userId", 7]}, 10, "$user1.userDetail.userId"]},
      "user2.userDetail.userId": {
        $cond: [{$eq: ["$user2.userDetail.userId", 7]}, 10,
          "$user2.userDetail.userId"
        ]
      }
    }
  }
],
{multi: true})

正如您在 playground

上看到的