Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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
Arrays 如何使用mongoose从数组中删除对象_Arrays_Node.js_Mongodb_Mongoose - Fatal编程技术网

Arrays 如何使用mongoose从数组中删除对象

Arrays 如何使用mongoose从数组中删除对象,arrays,node.js,mongodb,mongoose,Arrays,Node.js,Mongodb,Mongoose,我正在尝试使用mongoose从文档中的数组中删除对象 架构如下所示: var diveSchema = new Schema({ //irrelevant fields divers: [{ user: { type: Schema.Types.ObjectId, ref: 'User', required: true }, meetingLocation: { type: String, enum: ['carpool', 'onSite'], req

我正在尝试使用mongoose从文档中的数组中删除对象

架构如下所示:

var diveSchema = new Schema({
//irrelevant fields
    divers: [{
        user: { type: Schema.Types.ObjectId, ref: 'User', required: true },
        meetingLocation: { type: String, enum: ['carpool', 'onSite'], required: true },
        dives: Number,
        exercise: { type: Schema.Types.ObjectId, ref: 'Exercise' },
    }]
});
        var diveId = "myDiveId";
        var userIdToRemove = "123456789"
        Dive.findOne({ _id: diveId }).then(function(dive) {
            dive.divers.pull({ user: userIdToRemove });
            dive.save().then(function(dive) {
                //do something smart
            });
        });
可能的条目可以是

{
    //irrelevant fields
    "divers": [
        {
            "_id": "012345678",
            "user": "123456789",
            "meetingLocation": "carpool",
            "exercise": "34567890",
        },
        {
            "_id": "012345679",
            "user": "123456780",
            "meetingLocation": "onSite",
            "exercise": "34567890",
        }
    ]
}
假设我想删除
user
123456789
的条目(注意,此时我不知道
\u id

如何正确地执行此操作

我尝试了以下方法:

var diveSchema = new Schema({
//irrelevant fields
    divers: [{
        user: { type: Schema.Types.ObjectId, ref: 'User', required: true },
        meetingLocation: { type: String, enum: ['carpool', 'onSite'], required: true },
        dives: Number,
        exercise: { type: Schema.Types.ObjectId, ref: 'Exercise' },
    }]
});
        var diveId = "myDiveId";
        var userIdToRemove = "123456789"
        Dive.findOne({ _id: diveId }).then(function(dive) {
            dive.divers.pull({ user: userIdToRemove });
            dive.save().then(function(dive) {
                //do something smart
            });
        });
这并没有改变文件

我也试过了

Dive.update({ _id: diveId }, { "$pull": { "divers": { "diver._id": new ObjectId(userIdToRemove) } } }, { safe: true }, function(err, obj) {
    //do something smart
});
我得到的结果是,整个
潜水员
阵列对于给定的潜水是空的。

这个呢

Dive.update({ _id: diveId }, { "$pull": { "divers": { "user": userIdToRemove } }}, { safe: true, multi:true }, function(err, obj) {
    //do something smart
});
试试这个

update({{u id:diveId},{“$pull”:{“drivers”:{“user”:“123456789”}})


这似乎有效!谢谢,但你能解释一下我做错了什么吗,因为我以前确实尝试过只使用
user
,但我没有添加
multi
部分当你有一个查询单个文档的更新操作
{code>{id:diveId}
,这个选项如何有用?@chridam,你说得对,对于单文档和$pull,使用multi:true可能有些过分,但老实说,我遇到过一些驱动程序,如果您不提供multi:true,它们只执行一个操作(不是文档),就会停止执行。例如,如果在数组中调用$set,则驱动程序只为某个驱动程序设置数组的第一个元素。这就是我使用它的原因。您可以避免它。@如果您确实尝试了相同的查询,可能在我之前的评论中提到了它不起作用的原因,所有这些基本上都归结为您的驱动程序是如何实现操作的。答案与上面相同。