Arrays 仅当阵列上的命令成功时,才使用增量字段

Arrays 仅当阵列上的命令成功时,才使用增量字段,arrays,node.js,mongodb,mongoose,Arrays,Node.js,Mongodb,Mongoose,我有这样一个模式: var ClassSchema = new Schema({ name: String, kids: [{ type: Schema.Types.ObjectId, ref: 'Kid' }], kidsCount: { type: Number, default: 0} }); 现在我想从数组中拖出一个孩子并减少计数器,只要这个孩子存在于数组中。可以在一个命令中完成吗 我试过这个: Class.findByIdAndUpdate( { _i

我有这样一个模式:

var ClassSchema = new Schema({
    name: String,
    kids: [{ type: Schema.Types.ObjectId, ref: 'Kid' }],
    kidsCount: { type: Number, default: 0}
});
现在我想
从数组中拖出一个孩子并减少计数器,只要这个孩子存在于数组中。可以在一个命令中完成吗

我试过这个:

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

但是无论孩子是否被找到,
kidsunt
总是递减的。

看来你使用了错误的方法。仅将
\u id
作为第一个参数,因此您希望改为使用完整条件对象

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

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

在尼尔的回答之后,我发现哪一个对我来说是更好的解决方案。您在回调中获得修改后的文档,如
findbyidanddupdate

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

就这样。后来我添加了
kids:kidId
条件,我没有考虑这个方法。谢谢,我错过了。接得好。