2016-11-17 45 views
1

我想知道這部分代碼是否可以以不同的方式寫入,只能使用模型的Mongoose輔助方法?如果沒有大於0的股票,我可以返回成功和錯誤嗎?通過findOneAndUpdate條件語句的Mongoose循環

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

這可能與原子更新,你可以溝初始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 
     } 
    ); 
} 
+0

對不起,我認爲這是一個好方法,但它不起作用,我需要將'findOneAndUpdate'更改爲'findOne'? err和doc返回null。 – user3703539

+0

然後使用'update()'這將返回寫入結果並檢查是否存在更新 – chridam