mongoose – 删除子文档数组项目

我有这个用户的小模式:

{ 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操作符实际上只是在它所在的数组元素上执行条件。 看来你的问题可能并不真正表明你可能正在使用默认情况下为所有数组字段创build的一个ObjectId值。

所以在导入ObjectId创build方法后,你可以像这样查询:

 model.findByIdAndUpdate(23, { '$pull': { 'contacts':{ '_id': new ObjectId(someStringValue) } } }); 

或者实际上你实际上可以更好地定义你的“架构”,并且mongoose实际上会根据架构中定义的“types”为你“自动生成”ObjectId:

 var contactSchema = new Schema({ approved: Boolean }); var userSchema = new Schema({ username: String, contacts: [contactSchema] }); 

这允许mongoose对严格types的字段定义“遵循规则”。 所以现在它知道你实际上对contacts数组的每个元素都有一个_id字段,而这个字段的“type”实际上是一个ObjectId所以它会自动重新提供一个作为一个真正的ObjectId提供的“String”值。

finaly!

 MongoDB: "imgs" : {"other" : [ { "crop" : "../uploads/584251f58148e3150fa5c1a7/photo_2016-11-09_21-38-55.jpg", "origin" : "../uploads/584251f58148e3150fa5c1a7/o-photo_2016-11-09_21-38-55.jpg", "_id" : ObjectId("58433bdcf75adf27cb1e8608") } ] }, router.get('/obj/:id', function(req, res) { var id = req.params.id; Model.findOne({'imgs.other._id': id}, function (err, result) { result.imgs.other.id(id).remove(); result.save(); });