假設我們有以下集合,我對此幾乎沒有疑問:
{
"_id" : ObjectId("4faaba123412d654fe83hg876"),
"user_id" : 123456,
"total" : 100,
"items" : [
{
"item_name" : "my_item_one",
"price" : 20
},
{
"item_name" : "my_item_two",
"price" : 50
},
{
"item_name" : "my_item_three",
"price" : 30
}
]
}
在這種情況下,我必須一次更新 item_name 或 price,或者同時更新兩者。
例如:如果我在 req.body 中提供 item_name,那么它應該只更新 item_name 并且價格保持不變,但如果我提供價格,那么它應該反之亦然。
基本上,我的意思是說它應該只更新 req.body 中提供的那個欄位。
我試過這個
const result = await User.updateOne(
{
user_id: 123456,
'items.item_name': 'my_item_two',
},
{ $set: { items: req.body } }
)
但這與我想要的一樣,但它正在洗掉已經存在的剩余欄位!
uj5u.com熱心網友回復:
我認為您可以$set在 JS 中創建物件,然后將其傳遞給查詢,如下所示:
// body is to mock req.body
const body_1 = {
item_name: "new_name",
price: 1
}
const body_2 = {
item_name: "new_name_2"
}
const body_3 = {
price: 2
}
const getSetObject = (body) => {
update = {
$set: {}
}
Object.keys(body).forEach(k => {
update.$set[`items.$.${k}`] = body[k]
})
return update
}
console.log(getSetObject(body_1))
console.log(getSetObject(body_2))
console.log(getSetObject(body_3))
請注意這如何創建這些查詢中使用的物件:
- 兩個值
- 一個值(item_name)
- 一值(價格)
因此,您可以創建查詢:
const result = await User.updateOne(
{
user_id: 123456,
'items.item_name': 'my_item_two',
},
setObj
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/423990.html
標籤:javascript 节点.js mongodb 表达 猫鼬
