【问题标题】:Increment field only if command on array was successful仅当阵列上的命令成功时才增加字段
【发布时间】:2014-04-11 09:25:04
【问题描述】:

我有一个这样的架构:

var ClassSchema = new Schema({
    name: String,
    kids: [{ type: Schema.Types.ObjectId, ref: 'Kid' }],
    kidsCount: { type: Number, default: 0}
});

现在我想pull 数组中的一个 Kid 并减少计数器,前提是该 Kid 存在于数组中。可以在一个命令中完成吗?

我试过这个:

Class.findByIdAndUpdate(
    { _id:classId, kids:kidId  },
    { $pull:{ kids:kidId }, $inc:{ kidsCount:-1 } },
    function(err, updatedClass){
        // ...
    }
);

但无论是否找到 Kid,kidsCount 总是递减。

【问题讨论】:

    标签: arrays node.js mongodb mongoose


    【解决方案1】:

    看来您使用了错误的方法。 findByIdAndUpdate _id 作为第一个参数,因此您需要update,它采用完整的条件对象。

    Class.update(
        { _id:classId, kids:kidId  },
        { $pull:{ kids:kidId }, $inc:{ kidsCount:-1 } },
        function(err, numAffected){
            // ...
        }
    );
    

    当然,您不会在回调中获取更新的文档。如果你真的需要,你必须在这里找到它。

    【讨论】:

    • 就是这样。之后我添加了kids:kidId 条件,并没有考虑方法。谢谢。
    【解决方案2】:

    在 Neil 回答之后,我发现 findOneAndUpdate 在我的情况下甚至是一个更好的解决方案。你在回调中得到修改后的文档,就像findByIdAndUpdate

    Class.findOneAndUpdate(
        { _id:classId, kids:kidId  },
        { $pull:{ kids:kidId }, $inc:{ kidsCount:-1 } },
        function(err, updatedClass){
          // ...
        }
    );
    

    【讨论】:

    • 我错过了。好皮卡。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2021-10-28
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    相关资源
    最近更新 更多