我有一个这样的架构:
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
总是递减,无论是否找到了孩子。
答案 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){
// ...
}
);