2016-11-17 3 views
1

Я хочу знать, может ли эта часть кода быть написана по-разному, только с помощью методов поддержки моделей Mongoose? Могу ли я вернуть успех и ошибку, если нет запаса больше 0?Mongoose loop через findOneAndUpdate condition statement

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

Смежные вопросы