mongodb 使用 db.update() 更新多个数组元素
mongodb update multiple Array elements using db.update()
我参考相关的Whosebug答案编译了2个更新查询,但是,它似乎不起作用,查询更新所有元素,而只有符合条件的元素才有望更新。
文件:
[
{
"_id": 259,
"members": [
{
"email": "test1@gmail.com",
"added_by": "javapedia.net",
"status": "pending"
},
{
"email": "test2@gmail.com",
"added_by": "javapedia.net",
"status": "pending"
},
{
"email": "test3@gmail.com",
"status": "pending"
}
]
}
]
查询 1:使用 elemMatch 运算符,mongodb 操场: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
})
查询 2:使用 $in,mongodb 游乐场:https://mongoplayground.net/p/tNu395B2RFx
db.collection.update({
_id: 259,
"members.email": {
"$in": [
"test3@gmail.com",
"test4@gmail.com"
]
}
},
{
"$set": {
"members.$[].status": "active"
}
},
{
"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()
语义上可能更好
我参考相关的Whosebug答案编译了2个更新查询,但是,它似乎不起作用,查询更新所有元素,而只有符合条件的元素才有望更新。
文件:
[
{
"_id": 259,
"members": [
{
"email": "test1@gmail.com",
"added_by": "javapedia.net",
"status": "pending"
},
{
"email": "test2@gmail.com",
"added_by": "javapedia.net",
"status": "pending"
},
{
"email": "test3@gmail.com",
"status": "pending"
}
]
}
]
查询 1:使用 elemMatch 运算符,mongodb 操场: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
})
查询 2:使用 $in,mongodb 游乐场:https://mongoplayground.net/p/tNu395B2RFx
db.collection.update({
_id: 259,
"members.email": {
"$in": [
"test3@gmail.com",
"test4@gmail.com"
]
}
},
{
"$set": {
"members.$[].status": "active"
}
},
{
"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()