通过findOneAndUpdate条件语句

时间:2016-11-17 02:47:55

标签: mongodb mongoose lodash

我想知道这部分代码是否可以用不同的方式编写,只能使用模型的Mongoose辅助方法?如果没有库存大于0,我可以返回成功和错误吗?

ProductSchema.statics.substractStock = function (products) {
  _.map(products, updateStock)
  function updateStock(o) {
    mongoose.model('Product').findById(o._id, function (err, product) { 
      return product 
    }).then(function(productDB){
      if(productDB.stock > o.stock && productDB.stock > 0){
        mongoose.model('Product').findOneAndUpdate(o._id, {$inc: {stock: -(o.stock)}}, {},
          function (err, doc) {
              //return success ??
          }
        );
      } else {
        //return 'no update' 
      }
    });
  }
};

1 个答案:

答案 0 :(得分:1)

这可以通过原子更新完成,您可以放弃初始findById()调用并包含比较逻辑

if (productDB.stock > o.stock && productDB.stock > 0) { ... }

在查询中,如下所示:

function updateStock(o) {
    mongoose.model('Product').findOneAndUpdate( 
        { 
            "_id": o._id,
            "$and": [
                { "stock": { "$gt": o.stock } } ,
                { "stock": { "$gt": 0 } }
            ]
        },
        { "$inc": { "stock": -(o.stock) } }, 
        { "new": true }, // <-- returns modified document
        function (err, doc) {
            // check whether there was an update
        }
    );
}