我对mongo / mongoose这个问题感到非常困惑。我本质上是尝试获取一系列产品,从阵列中删除某个产品,然后使用省略所选产品的新阵列更新购物图表。这是我正在处理的代码片段:
if ( Selection < 0) or (Selection > 3):
这是我服务器的输出:
while (Selection != 4):
根据我的console.logs,我正在按照我想要的方式获取阵列,但它根本不会使用新阵列更新购物车。我已经盯着这段代码太久了,我很欣赏第二眼。感谢。
P.S。忽略产品ID都是相同的事实,它只是一个测试变量
购物车架构:
while True:
产品架构:
const remove = (req, res, next) => {
console.log('here is the product id ' + req.body.cart.product)
delete req.body._owner // disallow owner reassignment.
Cart.find({_id: req.user.cartId})
.then((products1) => {
console.log("array of products: " + products1[0].product)
const index = products1[0].product.indexOf(req.body.cart.product)
console.log("index valeu: " + index)
if (index > -1) {
products1[0].product.splice(index, 1)
return products1[0].product
}
return products1[0].product
})
.then((products2) => {
console.log('Second Promise Input: ' + products2)
Cart.update({_id: req.user.cartId}, {$set: {product: products2}})
})
.then(() => res.sendStatus(204))
.catch(next)
}
显示请求:
Server listening on port 4741
here is the product id 5952b57ea52d092b8d34c6b0
array of products: 5952b57ea52d092b8d34c6b0,5952b57ea52d092b8d34c6b0,5952b57ea52d092b8d34c6b0,5952b57ea52d092b8d34c6b0,5952b57ea52d092b8d34c6b0
index valeu: 0
Second Promise Input: 5952b57ea52d092b8d34c6b0,5952b57ea52d092b8d34c6b0,5952b57ea52d092b8d34c6b0,5952b57ea52d092b8d34c6b0
PATCH /carts-decrease/595b037e128cfd37e0c864d7 204 38.773 ms
答案 0 :(得分:0)
我建议您稍微修改cartSchema
并以embedded documents数组的形式存储产品:
const cartSchema = new mongoose.Schema({
products: [{
name: { type: String },
price: { type: Number }
...
}]
...
});
如果您这样做,只需使用$pull
更新运算符即可从购物车中删除商品:
{ $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }
在您的情况下,查询应如下所示:
Cart.update(
{ _id: req.user.cartId },
{ $pull: { products: { '_id': req.body.cart.product } }}
);
由于嵌入式文档将拥有自己的ObjectId,因此只有一个文档与查询匹配。