慕姐4208626
2022-12-09 16:42:32
假設(shè)我有一系列商店:[ { "_id": 0, "items": [ {"_id": 3, "price": 10} ] }, { "_id": 1, "items": [] }, { "_id": 2 }]我想將price商店中的商品 3 更新為 30,如果該商店中沒(méi)有商品,則在商店中插入一個(gè)新商品和/或在必要時(shí)插入一個(gè)新商店:商店 0:僅更新商品商店 1:附加{"_id": 3, "price": 30}到商店 1 的items商店 2:將商店 2 設(shè)置items為[{"_id": 3, "price": 30}]店鋪3:插入文件{"_id": 3, "items": [{"_id": 3, "price": 30}]}換句話(huà)說(shuō),我想:collection.updateOne({_id: <shopId>, 'items._id': 3}, {$set: {'items.$.price': 30}})如果該項(xiàng)目存在(商店 0)collection.updateOne({_id: <shopId>}, {$push: {items: {_id: 3, price: 30}}}, {upsert: true})如果沒(méi)有(商店 1 到 3)這有點(diǎn)像$with upsert,但文檔明確指出upsert不能與它一起使用:不要將位置運(yùn)算符$與 upsert 操作一起使用,因?yàn)椴迦雽⑹褂?作為插入文檔中的字段名稱(chēng)。$[<identifier>]也不起作用:如果 upsert 操作不包括完全相等匹配并且沒(méi)有找到匹配的文檔來(lái)更新,則 upsert 操作將出錯(cuò)。有沒(méi)有辦法不用多次訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)就可以做到這一點(diǎn)?我嘗試過(guò)的事情:// Updating the path 'items' would create a conflict at 'items'collection.updateOne( {_id: 0, 'items._id': 3}, {$set: {'items.$.price': 30}, $setOnInsert: {items: []}})// $[<identifier>] with upsert doesn't work// The path 'items' must exist in the document in order to apply array updates.collection.updateOne( {_id: 2}, {$set: {'items.$[item].price': 30}}, {arrayFilters: [{'item._id': 3}], upsert: true})// Updating the path 'items' would create a conflict at 'items'collection.updateOne( {_id: 0}, {$set: {'items.$[item].price': 30}, $setOnInsert: {items: []}}, {arrayFilters: [{'item._id': 3}], upsert: true})
1 回答

哆啦的時(shí)光機(jī)
TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊
正如D. SM所說(shuō),您可以bulkWrite
一次完成多項(xiàng)操作:
const shopId = 0
collection.bulkWrite([
// Remove any existing item
{
updateOne: {
filter: {_id: shopId},
update: {$pull: {items: {_id: 3}}}
}
},
// Add the item with the updated price to the shop
{
updateOne: {
filter: {_id: shopId},
update: {
$push: {items: {_id: 3, price: 30}}
},
upsert: true
}
}
])
添加回答
舉報(bào)
0/150
提交
取消