提问人:koque 提问时间:11/17/2023 更新时间:11/17/2023 访问量:39
为什么我的猫鼬更新没有找到匹配项?
Why is my mongoose update not finding a match?
问:
我的购物车收藏中有以下文档:
{
"_id": {
"$oid": "6555453298c59137f9cb2ee5"
},
"userId": {
"$oid": "6555453298c59137f9cb2ee3"
},
"email": "[email protected]",
"items": [
{
"quantity": 3,
"product": {
"$oid": "655437995bc92c0647deb512"
},
"_id": {
"$oid": "65555277fe01541a2052bd5f"
}
},
{
"quantity": 1,
"product": {
"$oid": "655437995bc92c0647deb513"
},
"_id": {
"$oid": "65555278fe01541a2052bd65"
}
}
}
在 items 数组中,我想将数量增加 1,其中 product (productId) = 655437995bc92c0647deb512。我的加成函数如下:
exports.increaseProductQuantity = async (req, res) => {
console.log('user.service increaseProductQuantity')
const {productId} = req.body;
console.log('productIdd', productId)
const email = authenticateToken(req, res)
console.log('increaseProductQuantity email', email)
(increaseProductQuantity email logs [email protected])
try {
await Cart.updateOne({
"email": email
}, {
"$inc": {
"items.$.quantity": 1
}
}, {
"arrayFilters": [{
"items.product": productId
}]
})
const cart = await Cart.findOne({
email: email,
}).populate({
path: 'items.product',
model: 'Products'
})
console.log('cart', cart)
// const newCart = JSON.parse(JSON.stringify(cart));
// newCart.cartTotal = computeCartTotal(newCart);
// console.log('newCart', newCart)
// res.status(201).json(newCart)
} catch (error) {
console.error(error);
return res.status(500).send('Problem changing item quantity.')
}
}
我收到错误:
MongoServerError: The positional operator did not find the match needed from the query.
答:
2赞
eekinci
11/17/2023
#1
更改查询以直接匹配:updateOne
productId
await Cart.updateOne(
{
"email": email,
"items.product": productId
},
{
"$inc": {
"items.$.quantity": 1
}
}
);
或者您可以使用该选项直接检索更新的:findOneAndUpdate
new
cart
const cart = await Cart.findOneAndUpdate(
{ "email": email, "items.product": productId },
{ "$inc": { "items.$.quantity": 1 } },
{ new: true, populate: { path: 'items.product', model: 'Products' } }
);
0赞
Yong Shun
11/17/2023
#2
@eekinci 的答案是正确的,它将通过假设值是唯一的,通过 $
更新数组中的第一个匹配元素。items
product
对于当前使用 的实现,必须应用过滤后的位置运算符 $[<identifier>]。
arrayFilters
await Cart.updateOne({
"email": email
},
{
"$inc": {
"items.$[item].quantity": 1
}
},
{
"arrayFilters": [
{
"item.product": productId
}
]
});
评论