在mongodb中减少和删除直到产品数量达到0
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在mongodb中减少和删除直到产品数量达到0相关的知识,希望对你有一定的参考价值。
我有诸如购物清单之类的对象数组。例如,我在清单中添加了2种产品
cart:[id:1,quantity:15,id:2,quantity:5]
我可以很好地增加和减少数量,但是我想做的是当我减少到0时我希望它显示出来,因为我在购物车中没有,我知道它有可能被拉出,我尝试过这个并且失败了。我做错了什么,当我尝试console.log(user)时,它给了我null,因为它没有看到“ cart.quantity”:0,idk为什么不呢。顺便说一句,用户信息和布局都可以。
router.get("/:productId/decrement", auth, async (req, res) =>
const user = await User.findOne(
id: req.user._id,
"cart.quantity": 0,
);
if (user)
await User.findOneAndUpdate(
id: req.user._id,
"cart.id": req.params.productId,
"cart.quantity": 0,
,
$pull: cart: id: req.params.productId
);
else
await User.findOneAndUpdate(
id: req.user._id,
"cart.id": req.params.productId,
,
$inc: "cart.$.quantity": -1 ,
new: true ,
(err, doc) =>
if (err)
return res.json( success: false, err );
return res.json( success: true, cart: doc );
);
);
这是我的用户模式
const userSchema = mongoose.Schema(
name:
type: String,
maxlength: 50,
,
email:
type: String,
trim: true,
unique: 1,
,
password:
type: String,
minglength: 5,
,
lastname:
type: String,
maxlength: 50,
,
cart: type: Array, default: [] ,
答案
在MongoDB版本上> = 3.2:
router.get("/:productId/decrement", auth, async (req, res) =>
try
let bulkArr = [
updateOne:
filter:
id: req.user._id,
"cart.id": req.params.productId,
"cart.quantity": 1, // You can use $lte : 1
,
update: $pull: 'cart': id: req.params.productId ,
,
,
updateOne:
filter:
id: req.user._id,
"cart.id": req.params.productId
,
update: $inc: "cart.$.quantity": -1 ,
,
,
];
await User.bulkWrite(bulkArr);
return res.json( success: true );
catch (error)
console.log("Error ::", error);
return res.json( success: false, ...error );
);
注意:
- 我相信您正在混合
async-await
和&callbacks()
。请尝试避免它。 - 在
bulkWrite
中,将执行所有过滤条件,但仅在一个DB调用中,如果各个过滤器匹配(各个操作的种类),则将执行更新操作。 bulkWrite
输出'写入结果',但是如果需要结果文档,则需要进行.find()
调用。但是,由于使用bulkWrite
的全部目的是避免多次调用DB-如果结果没有错误,则可以将成功消息发送到前端,然后它们可以显示适当的计数(通过递减)。
Ref: .bulkwrite()
在MongoDB版本上> = 4.2:
由于我们可以在更新中使用聚合,因此您可以像下面这样:
User.findOneAndUpdate(id: req.user._id, 'cart.id': req.params.productId,
[
$addFields:
cart:
$reduce:
input: "$cart",
initialValue: [],
in:
$cond: [
$and: [ $eq: [ "$$this.id", req.params.productId ] , $gt: [ "$$this.quantity", 1 ] ] ,
$concatArrays: [ "$$value", [ $mergeObjects: [ "$$this", quantity: $add: [ "$$this.quantity", -1 ] ] ]]
,
$cond: [ $eq: [ "$$this.id", req.params.productId ] , "$$value", $concatArrays: [ "$$value", [ "$$this" ] ] ]
]
], new: true)
Ref: aggregation-pipeline-for-updates,$reduce
这里测试聚合管道:mongoplayground
注意:
[少数MongoDB客户端可能会抛出错误,说'更新操作可能只包含原子运算符',在这种情况下,您可以使用.update()
或使用代码对其进行测试,因为大多数支持4.2
的驱动程序都不会抛出此类错误。
以上是关于在mongodb中减少和删除直到产品数量达到0的主要内容,如果未能解决你的问题,请参考以下文章