如何使用对象数组中包含对象字段的条件更新 mongoDB 文档
How to update mongoDB document with condition of containing object field in the array of objects
目标是在user.inCart数组中查找对象字段值,如果找到该值,则更新对象字段数量。否则,将一个新对象推送到数组。
我的代码运行良好:
Users.findOneAndUpdate({
id:req.user.id,
'inCart.item': req.body.item
},
{
$inc: {'inCart.$.quantity': req.body.quantity}
}).then(data=>{
if (data!=null) {
res.status(200)
} else{
Users.findOneAndUpdate({
id:req.user.id,
},{
$push : {inCart:{item:req.body.item, quantity: req.body.quantity} }
}).then(()=>res.status(200))
}
})
}
有没有办法对单个请求执行相同的操作?
查询
- 你可以通过管道更新来做到这一点 MongoDB >= 4.2
- 找到id
- 过滤以查看项目是否存在(在代码中将
1
替换为项目标识符(itemName/code 等))
- if
isNewItem
=> 将其添加到数量为 1 的 inCard
- else
$map
并更新数量 1
*而不是 filter+map,你也可以用 1 个 reduce 来完成,但是如果你喜欢 inCard>1000
items
,concatArrays 会更慢
update({"id":{"$eq":1}},
[{"$set":
{"isNewItem":
{"$eq":
[{"$filter":
{"input":"$inCard", "cond":{"$eq":["$$this.item", 1]}}},
[]]}}},
{"$set":
{"inCard":
{"$cond":
["$isNewItem",
{"$concatArrays":["$inCard", [{"item":1, "quantinty":1}]]},
{"$map":
{"input":"$inCard",
"in":
{"$cond":
[{"$eq":["$$this.item", 1]},
{"$mergeObjects":
["$$this", {"quantity":{"$add":["$$this.quantity", 1]}}]},
"$$this"]}}}]}}}, {"$unset":["isNewItem"]}])
我希望这能解决您的问题,购物车默认数量为 0 或少于 1
Users.findOneAndUpdate({
id: req.user.id,
'inCart.item': req.body.item
}, {
$set: {
'inCart.$.quantity': {
$cond: {
if: {
$gte: ["inCart.$.quantity", 1]
},
then: {
$add: ["inCart.$.quantity", req.body.quantity]
},
else: req.body.quantity
}
}
}
})
目标是在user.inCart数组中查找对象字段值,如果找到该值,则更新对象字段数量。否则,将一个新对象推送到数组。
我的代码运行良好:
Users.findOneAndUpdate({
id:req.user.id,
'inCart.item': req.body.item
},
{
$inc: {'inCart.$.quantity': req.body.quantity}
}).then(data=>{
if (data!=null) {
res.status(200)
} else{
Users.findOneAndUpdate({
id:req.user.id,
},{
$push : {inCart:{item:req.body.item, quantity: req.body.quantity} }
}).then(()=>res.status(200))
}
})
}
有没有办法对单个请求执行相同的操作?
查询
- 你可以通过管道更新来做到这一点 MongoDB >= 4.2
- 找到id
- 过滤以查看项目是否存在(在代码中将
1
替换为项目标识符(itemName/code 等)) - if
isNewItem
=> 将其添加到数量为 1 的 - else
$map
并更新数量 1
inCard
*而不是 filter+map,你也可以用 1 个 reduce 来完成,但是如果你喜欢 inCard>1000
items
update({"id":{"$eq":1}},
[{"$set":
{"isNewItem":
{"$eq":
[{"$filter":
{"input":"$inCard", "cond":{"$eq":["$$this.item", 1]}}},
[]]}}},
{"$set":
{"inCard":
{"$cond":
["$isNewItem",
{"$concatArrays":["$inCard", [{"item":1, "quantinty":1}]]},
{"$map":
{"input":"$inCard",
"in":
{"$cond":
[{"$eq":["$$this.item", 1]},
{"$mergeObjects":
["$$this", {"quantity":{"$add":["$$this.quantity", 1]}}]},
"$$this"]}}}]}}}, {"$unset":["isNewItem"]}])
我希望这能解决您的问题,购物车默认数量为 0 或少于 1
Users.findOneAndUpdate({
id: req.user.id,
'inCart.item': req.body.item
}, {
$set: {
'inCart.$.quantity': {
$cond: {
if: {
$gte: ["inCart.$.quantity", 1]
},
then: {
$add: ["inCart.$.quantity", req.body.quantity]
},
else: req.body.quantity
}
}
}
})