我有这个供用户使用的小架构:
{
username: String,
contacts: Array
}
例如,某些用户的联系人将如下所示:
{
username: "user",
contacts: [{'id': ObjectId('525.....etc'), 'approved': false}, {'id':ObjectId('534.....etc'), 'approved': true}]
}
现在我需要从联系人中删除一个项目,所以我这样做:
model.findByIdAndUpdate(23, {'$pull': {
'contacts':{'id':'525.....etc'}
}});
但似乎不起作用,没有错误,但它没有被删除,我只想将这个文档返回给用户:
{
username: "user",
contacts: [{'id':ObjectId('534.....etc'), 'approved': false}]
}
如何做到这一点?
最佳答案
$pull
运算符实际上只是对它正在操作的数组元素执行条件。看来您的问题实际上可能并未表明您可能正在使用 mongoose 默认为所有数组字段创建的 ObjectId
值。
所以你可以这样查询,在导入 ObjectId
创建方法之后:
model.findByIdAndUpdate(23, {
'$pull': {
'contacts':{ '_id': new ObjectId(someStringValue) }
}
});
或者实际上你可以更好地定义你的“模式”, Mongoose 实际上会根据模式中定义的“类型”为你“自动转换”ObjectId:
var contactSchema = new Schema({
approved: Boolean
});
var userSchema = new Schema({
username: String,
contacts: [contactSchema]
});
这允许 mongoose 为严格类型的字段定义“遵循规则”。所以现在它知道您实际上有一个 _id
字段用于联系人数组的每个元素,并且该字段的“类型”实际上是一个 ObjectId
所以它会自动重新转换作为 true ObjectId 提供的“String”值。
关于javascript - Mongoose - 删除子文档数组项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26252569/