我想知道这部分代码是否可以用不同的方式编写,只能使用模型的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'
}
});
}
};
答案 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
}
);
}