在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 );
  
);

注意:

  1. 我相信您正在混合async-await和&callbacks()。请尝试避免它。
  2. bulkWrite中,将执行所有过滤条件,但仅在一个DB调用中,如果各个过滤器匹配(各个操作的种类),则将执行更新操作。
  3. 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的主要内容,如果未能解决你的问题,请参考以下文章

在列表中定位产品并增加/减少其数量

MongoDB:从数组的开头删除一定数量的元素

在 JavaScript 或 jQuery 中增加和减少数量时如何计算价格?

映射减少以删除重复项(mongodb)

从字符串中删除所有初始数字,直到达到非数字字符

从文档中删除字段后,MongoDB 集合大小未更改