Javascript Mongoose-删除子文档数组项
我有一个供用户使用的小模式:Javascript Mongoose-删除子文档数组项,javascript,node.js,mongodb,mongoose,mongodb-query,Javascript,Node.js,Mongodb,Mongoose,Mongodb Query,我有一个供用户使用的小模式: { username: String, contacts: Array } 例如,一些用户的联系人将如下所示: { username: "user", contacts: [{'id': ObjectId('525.....etc'), 'approved': false}, {'id':ObjectId('534.....etc'), 'approved': true}] } 现在我需要从联系人中删除一个项目,以便: model.findByIdAnd
{
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}]
}
如何实现这一点?操作符实际上只是在其操作的数组元素上执行条件。您的问题似乎并没有实际表明您可能正在使用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“遵循规则”进行严格类型的字段定义。因此,现在它知道,联系人数组的每个元素实际上都有一个\u id
字段,该字段的“类型”实际上是一个ObjectId
,因此它将自动重新转换作为真正ObjectId提供的“字符串”值。最后
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();
});
您好,谢谢,但现在我遇到了这个错误:[MongoError:exception:无法使用部分(contacts of contacts.id)遍历元素({contacts:[{id:ObjectId('543394bb964ac60915ceba8b'),approved:false},{id:ObjectId('543399f9964ac60915ceba8c'),approved:false})这可能是什么?我用了你的点批注-@sbaaang你到底在干什么?你用的是“点批注”吗按要求填写表格?顺便说一句,感谢您清楚地表明您的实际数据与您发布的数据不同,这可能再次成为问题的一部分。请编辑以显示您的真实数据结构。是的,如您所说,使用点符号,是的,我使用ObjectID,但这不是问题,我猜:P不?(编辑问题)好的,修复了我在问题中发布的只需要在查询时包装新的ObjectId(idContact)的问题;)谢谢!请编辑答案,这样我就可以接受它,使其成为清晰的模型。FindByIDUpdate(23,{'pull':{'contacts':{'id':new ObjectId('525….etc')});有效