我正在嘗試使用貓鼬集合中的鍵來減少值。
所以,我到底想要的是總價格值應該減少該產品價格值以及數量-1。
這是我的購物車架構:
var mongoose = require('mongoose');
let itemSchema = mongoose.Schema({
product: {
type: mongoose.Schema.Types.ObjectId,
ref: "Product"
},
quantity: Number,
price: Number
});
var cartSchema = mongoose.Schema({
userID: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
},
items: [itemSchema],
totalPrice: { type: Number, default: 0 },
});
module.exports = mongoose.model('Cart', cartSchema);
這是我的控制器:
module.exports.deleteCartItem = async (req, res, next) => {
const { productID } = req.params;
const cart = await Cart.findOneAndUpdate({
userID: req.user._id,
"items.product": productID
}, {
$inc: {
'items.$.quantity': -1,
totalPrice: -price
}
}, { new: true });
}
我的購物車收藏:
{
"_id": {
"$oid": "61d49c20e59e3f2690966ffb"
},
"totalPrice": 1098,
"userID": {
"$oid": "6187fe7cacbffaf7d01a3e23"
},
"items": [{
"_id": {
"$oid": "61d49c20e59e3f2690966ffc"
},
"product": {
"$oid": "61d1bb34cfa792063ca5d86d"
},
"quantity": 2,
"price": 499
}, {
"_id": {
"$oid": "61d56763340e1607788c8831"
},
"product": {
"$oid": "61d1bc25cfa792063ca5d86e"
},
"quantity": 1,
"price": 100
}]
}
呼叫 deleteCartItem 時我想要的最終結果:
{
"_id": {
"$oid": "61d49c20e59e3f2690966ffb"
},
"totalPrice": 599,
"userID": {
"$oid": "6187fe7cacbffaf7d01a3e23"
},
"items": [{
"_id": {
"$oid": "61d49c20e59e3f2690966ffc"
},
"product": {
"$oid": "61d1bb34cfa792063ca5d86d"
},
"quantity": 1,
"price": 499
}, {
"_id": {
"$oid": "61d56763340e1607788c8831"
},
"product": {
"$oid": "61d1bc25cfa792063ca5d86e"
},
"quantity": 1,
"price": 100
}]
}
錯誤:
ReferenceError: 價格未在 module.exports.deleteCartItem (E:\Projects\mean\server\controllers\cartController.js:143:59) 中定義
如果我洗掉了totalPrice行,數量就會成功減少。
有沒有辦法做到這一點?請幫忙。謝謝
uj5u.com熱心網友回復:
事實上,price沒有定義,因此,當您嘗試使用 更新總價時totalPrice: -price,會引發錯誤。
假設您想使用price檔案中包含的更新此密鑰,您必須首先檢索您的檔案,然后才更新它:
module.exports.deleteCartItem = async (req, res, next) => {
const { productID } = req.params;
const originalCart = await Cart.findOne({
userID: req.user._id,
"items.product": productID
});
const priceToReduce = originalCart.items.find(item => item['$oid'] === productID);
await originalCart.updateOne( {
$inc: {
'items.$.quantity': -1,
totalPrice: -priceToReduce
}
});
}
請注意,它updateOne不會回傳修改后的物件(findOneAndUpdate與new: true選項一樣)。如果您確實需要獲取修改物件,只需執行相同的代碼并將updateOnefunc替換為findOneAndUpdate(有點多余,因為我們已經為我們的目的檢索了原始物件):
module.exports.deleteCartItem = async (req, res, next) => {
const { productID } = req.params;
const originalCart = await Cart.findOne({
userID: req.user._id,
"items.product": productID
});
const priceToReduce = originalCart.items.find(item => item['$oid'] === productID);
const newCart = await Cart.findOneAndUpdate({
userID: req.user._id,
"items.product": productID
},
{
$inc: {
'items.$.quantity': -1,
totalPrice: -priceToReduce
}
},
{
new: true
});
}
此外,這不會處理任何可能發生的錯誤(如果什么find(item => item.oid === productID);都沒有找到怎么辦?如果productID是未定義/空怎么辦?)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/405570.html
標籤:
