根据条件 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
上看到的
这是我的架构
{ _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
上看到的