我有一条快速路由OfferRouter.route('/:offerId/series/:seriesId')
,可以访问以下嵌套的Mongoose文档:
var Series = new Schema({
_id: mongoose.Schema.Types.ObjectId,
...
active: {type: Boolean, default: false},
qty: {type: Number, default: 0}
});
var Offer = new Schema({
_id: mongoose.Schema.Types.ObjectId,
...
series : [
{ type: Series }
]
});
我需要在offerId文档中找到特定的seriedId,然后检查它是active
还是qty > 0
,然后才递减qty
。
否则,对于active == false
或qty == 0
情况,我将必须返回错误。
我考虑过链接那些顺序的步骤,但是那不是原子的,对吧? 我该如何用猫鼬自动做到这一点?
仅投影系列文档也很不错。
我正在尝试类似的方法,但是我不知道如何检查活动量和数量。也不怎么只投影找到的系列文件;而且我也不知道遇到什么具体的错误:
Offers.findOneAndUpdate({
_id: offerId,
series._id: seriesId
}, {
$dec: { "series.$.qty" : 1 }
}, function(err, series) {
if (err) return next(err);
...
res.json(...);
});
答案 0 :(得分:0)
您将需要使用array filters这样:
var query = { _id: offerId };
var update = { $inc: { 'series.$[elem].qty': -1 } };
var options = {
arrayFilters: [ { 'elem._id': seriesId, 'elem.active' : true, 'elem.qty': { $gt: 0 } } ],
projection: { _id: 0, series: 1 } // return only the "series" field
};
Offers.findOneAndUpdate(query, update, options, ...);