例如,集合中有以下檔案:
{
_id: 'doc1',
teams: [{
_id: '1',
name: 'team 1',
color: 'red',
}, {
_id: '2',
name: 'team 2',
color: 'green',
}, {
_id: '3',
name: 'team 3',
color: 'blue',
},
...]
}
并且有部分更新teams:
{
teams: [{
_id: '1',
name: 'A - team',
}, {
_id: '3',
color: 'green',
}]
}
要更新陣列中的單個元素,我可以$像這樣使用運算子:
db.collection.findOneAndUpdate({_id: 'doc1', 'teams._id':'1'}, {$set: {'teams.$.name': 'A - team'}})
但是,我需要更新多個元素并獲得結果,最好的方法是什么?是否有類似于$pushand$pull運算子的東西在單個操作中起作用?
uj5u.com熱心網友回復:
如果要根據陣列子檔案 _id 在單個查詢中更新陣列中的不同元素,可以使用arrayFilters ,如下所示:
db.collection.update({
_id: "doc1"
},
{
$set: {
"teams.$[x].name": "A - team","teams.$[x].color": "green",
"teams.$[y].name": "B - team","teams.$[y].color": "yellow",
"teams.$[z].name": "C - team","teams.$[z].color": "pink"
}
},
{
arrayFilters: [
{
"x._id": "1"
},
{
"y._id": "2"
},
{
"z._id": "3"
}
]
})
解釋:
為每個陣列 _id 創建 arrayFilters ,并在更新查詢的更新部分中為示例 x,y,z 中定義的每個過濾器添加 $set 陳述句。
操場
如果您在多個檔案中有相同的陣列 _id 只需洗掉初始查詢部分,以便搜索所有集合的請求,使用選項 {multi:true} 執行更新查詢將更新那些 _id 匹配的所有檔案,而不僅僅是第一個匹配.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/438871.html
標籤:mongodb
