所以,我在這里試圖實作的是兩件事。第一個是減少產品的數量。其次,如果該產品數量為 0,則洗掉該產品。所以我試圖設定一個條件,如果產品數量為 0,則洗掉該產品,否則只需減少數量。
這是我的購物車檔案:

這是我的功能:
const cart = await Cart.findOneAndUpdate(
{ userID: req.body.userID, "items.productID": req.body.productID },
{$lt: ['items.productID', 0] ? { $pull: { items: { productID: req.body.productID } } } : { $inc: { 'items.$.quantity': -1 } }},
{ new: true }
);
我試圖用三元運算子來實作這一點,但沒有奏效。有人可以幫我嗎?謝謝你。
uj5u.com熱心網友回復:
您不能在查詢中使用三元運算子。這不僅在 MongoDB 中不受支持,而且還會由 node.js 進行評估,而不是由 MongoDB 本身進行評估。事實上,您所描述的性質的條件更新操作本身并不是 MongoDB 能夠處理的。
最好的辦法是執行兩個查詢,第一個查詢執行遞減操作,第二個查詢取出數量小于或等于 0 的所有專案:
const cartAfterDecrement = await Cart.findOneAndUpdate(
{ userID: req.body.userID, "items.productID": req.body.productID },
{ $inc: { 'items.$.quantity': -1 } },
{ new: true }
);
const cartAfterPull = await Cart.findOneAndUpdate(
{ userID: req.body.userID, items: { $elemMatch: {
productID: req.body.productID,
quantity: { $lte: 0 }
} } },
{ $pull: {items: { quantity: { $lte: 0 } } } },
{ new: true }
);
const cart = cartAfterPull ? cartAfterPull : cartAfterDecrement;
如果您希望允許數量等于 0 的產品,那么修改第二個查詢是一件小事。
這種方法的唯一缺點是這兩次更新之間會有一個自然的、非常輕微的延遲,這可能會導致一種非常罕見的競爭情況,即退回購物車并包含數量小于或等于等于 0。為了避免這種情況,您需要使用服務器代碼或通過使用聚合檢索您的購物車來過濾掉這些值,或者您需要利用事務來確保這兩個操作發生在沒有在兩次寫入操作之間檢索檔案的順序。
話雖如此,構建適當的陣列過濾邏輯或事務管理超出了本問題的范圍,因此不會包含在本答案中。
uj5u.com熱心網友回復:
詢問
- 您可以通過管道更新(> = MongoDB 4.2)來完成
- 找到具有該 productID 的用戶
- 將專案減少到一個包含專案的陣列,但是
- 如果 productID 不是我要找的那個,保持原樣
- 否則如果
quantity=0洗掉它(不要將它添加到減少的陣列中) - 否則保持它
quantity-1
* findAndModify也接受pipeline,對于nodejs驅動你必須找到包裝這個命令的方法,或者直接運行命令
測驗代碼在這里
update(
{"userID": req.body.userID,
"items.productID": req.body.productID},
[{"$set":
{"items":
{"$reduce":
{"input":"$items",
"initialValue":[],
"in":
{"$switch":
{"branches":
[{"case":{"$ne":["$$this.productID", req.body.productID]},
"then":{"$concatArrays":["$$value", ["$$this"]]}},
{"case":{"$gt":["$$this.quantity", 0]},
"then":
{"$concatArrays":
["$$value",
[{"$mergeObjects":
["$$this", {"$subtract":["$this.quantity", 1]}]}]]}}],
"default":"$$value"}}}}}}])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/393178.html
