Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose-删除子文档数组项_Javascript_Node.js_Mongodb_Mongoose_Mongodb Query - Fatal编程技术网

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')});有效