仅当阵列上的命令成功时才增加字段

时间:2014-03-08 00:53:48

标签: arrays node.js mongodb mongoose

我有一个这样的架构:

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){
        // ...
    }
);

kidsCount总是递减,无论是否找到了孩子。

2 个答案:

答案 0 :(得分:1)

似乎你使用了错误的方法。 findByIdAndUpdate仅使用 _id作为第一个参数,因此您需要update代替完整条件对象。

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

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

答案 1 :(得分:1)

在Neil的回答之后,我发现findOneAndUpdate在我的案例中甚至是更好的解决方案。您可以像使用findByIdAndUpdate一样在回调中获取修改后的文档:

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