目標是在 user.inCart 陣列中查找物件欄位值,如果找到該值,則更新物件欄位數量。否則將一個新物件推送到陣列中。
我有這個代碼作業正常:
Users.findOneAndUpdate({
id:req.user.id,
'inCart.item': req.body.item
},
{
$inc: {'inCart.$.quantity': req.body.quantity}
}).then(data=>{
if (data!=null) {
res.status(200)
} else{
Users.findOneAndUpdate({
id:req.user.id,
},{
$push : {inCart:{item:req.body.item, quantity: req.body.quantity} }
}).then(()=>res.status(200))
}
})
}
有沒有辦法對單個請求做同樣的事情?
uj5u.com熱心網友回復:
詢問
- 您可以使用管道更新 MongoDB >= 4.2 來完成
- 找到身份證
- 過濾以查看專案是否存在(在代碼中將 替換
1為專案識別符號(專案名稱/代碼等)) - if
isNewItem=> 將其添加到inCard數量為 1 的 - 否則
$map,將數量更新 1
*代替filter map,你也可以用1個reduce來做,但是如果你有喜歡的inCard>1000專案,concatArrays會更慢
測驗代碼在這里
update({"id":{"$eq":1}},
[{"$set":
{"isNewItem":
{"$eq":
[{"$filter":
{"input":"$inCard", "cond":{"$eq":["$$this.item", 1]}}},
[]]}}},
{"$set":
{"inCard":
{"$cond":
["$isNewItem",
{"$concatArrays":["$inCard", [{"item":1, "quantinty":1}]]},
{"$map":
{"input":"$inCard",
"in":
{"$cond":
[{"$eq":["$$this.item", 1]},
{"$mergeObjects":
["$$this", {"quantity":{"$add":["$$this.quantity", 1]}}]},
"$$this"]}}}]}}}, {"$unset":["isNewItem"]}])
uj5u.com熱心網友回復:
我希望這能解決您的問題,購物車默認數量為 0 或小于 1
Users.findOneAndUpdate({
id: req.user.id,
'inCart.item': req.body.item
}, {
$set: {
'inCart.$.quantity': {
$cond: {
if: {
$gte: ["inCart.$.quantity", 1]
},
then: {
$add: ["inCart.$.quantity", req.body.quantity]
},
else: req.body.quantity
}
}
}
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/406700.html
標籤:
上一篇:MongoDB按時間間隔分組結果
下一篇:用于跨陣列計算分布的聚合
