问题描述
我参考相关的 stackoverflow 答案编译了 2 个更新查询,但是,它似乎不起作用,查询更新所有元素,而只有符合条件的元素才会更新。
文档:
[
{
"_id": 259,"members": [
{
"email": "test1@gmail.com","added_by": "javapedia.net","status": "pending"
},{
"email": "test2@gmail.com",{
"email": "test3@gmail.com","status": "pending"
}
]
}
]
Query1:使用 elemMatch 运算符,mongodb playground:https://mongoplayground.net/p/4cNgWJse86W
db.collection.update({
_id: 259,"members": {
"$elemMatch": {
"email": {
"$in": [
"test3@gmail.com","test4@gmail.com"
]
}
}
}
},{
"$set": {
"members.$[].status": "active"
}
},{
"multi": true
})
Query2: using $in,mongodb playground : https://mongoplayground.net/p/tNu395B2RFx
db.collection.update({
_id: 259,"members.email": {
"$in": [
"test3@gmail.com","test4@gmail.com"
]
}
},{
"multi": true
})
预期结果:只有一个具有 test3@gmail.com 状态的元素应更新为活动。
实际结果:两个查询都更新了所有记录。
解决方法
Is this what you're looking for?
db.collection.update({
_id: 259,},{
"$set": {
"members.$[el].status": "active"
}
},{
arrayFilters: [
{
"el.email": {
$in: [
"test3@gmail.com","test4@gmail.com"
]
}
}
]
})
-
如果需要,你可以把初始条件放回去,我只是保持简短(对我来说它们没有意义)。
-
multi:true
不需要一个文档 -
在语义上使用
可能更好updateOne()