猫鼬:有条件地在嵌套文档数组中进行原子查找和更新

时间:2018-08-13 17:32:21

标签: node.js mongodb mongoose

我有一条快速路由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 == falseqty == 0情况,我将必须返回错误。

我考虑过链接那些顺序的步骤,但是那不是原子的,对吧? 我该如何用猫鼬自动做到这一点?

仅投影系列文档也很不错。

我正在尝试类似的方法,但是我不知道如何检查活动量和数量。也不怎么只投影找到的系列文件;而且我也不知道遇到什么具体的错误:

    Offers.findOneAndUpdate({
        _id: offerId, 
        series._id: seriesId
    }, {
        $dec: { "series.$.qty" : 1 } 
    }, function(err, series) {
        if (err) return next(err);
        ...
        res.json(...);
    });

1 个答案:

答案 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, ...);