代码之家  ›  专栏  ›  技术社区  ›  João Otero

Mongoose:嵌套文档数组中的原子查找和更新,有条件地

  •  0
  • João Otero  · 技术社区  · 6 年前

    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 情况。

    我想把这些连续的步骤链接起来,但那就不是原子的了,对吧?

    也可以只投影出系列文档。

    我试过这样的方法,但我不知道如何检查活动和数量,也不知道如何只投影找到的序列文档;我也不知道hot是否能得到具体的错误:

        Offers.findOneAndUpdate({
            _id: offerId, 
            series._id: seriesId
        }, {
            $dec: { "series.$.qty" : 1 } 
        }, function(err, series) {
            if (err) return next(err);
            ...
            res.json(...);
        });
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   dnickless    6 年前

    你需要使用 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, ...);