如何使用对象数组中包含对象字段的条件更新 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 会更慢

Test code here

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
          }
        }
      }
    })