如何使用mongoose从数组中删除Object

Son*_*ryr 7 arrays mongoose mongodb node.js

我正在尝试使用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' },
    }]
});
Run Code Online (Sandbox Code Playgroud)

一个可能的条目可以

{
    //irrelevant fields
    "divers": [
        {
            "_id": "012345678",
            "user": "123456789",
            "meetingLocation": "carpool",
            "exercise": "34567890",
        },
        {
            "_id": "012345679",
            "user": "123456780",
            "meetingLocation": "onSite",
            "exercise": "34567890",
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

说我要删除的条目,其中user123456789(请注意,我不知道_id在这一点).

我该怎么做呢?

我尝试了以下方法:

        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
            });
        });
Run Code Online (Sandbox Code Playgroud)

这没有改变文件.

我也试过了

Dive.update({ _id: diveId }, { "$pull": { "divers": { "diver._id": new ObjectId(userIdToRemove) } } }, { safe: true }, function(err, obj) {
    //do something smart
});
Run Code Online (Sandbox Code Playgroud)

有了这个,我得到了整个divers阵列在给定的潜水中被清空的结果.

Rah*_*mar 17

那这个呢?

Dive.update({ _id: diveId }, { "$pull": { "divers": { "user": userIdToRemove } }}, { safe: true, multi:true }, function(err, obj) {
    //do something smart
});
Run Code Online (Sandbox Code Playgroud)


小智 6

我使用这段代码解决了这个问题 -

 await Album.findOneAndUpdate(
    { _id: albumId },
    { $pull: { images: { _id: imageId } } },
    { safe: true, multi: false }
  );
  return res.status(200).json({ message: "Album Deleted Successfully" });
Run Code Online (Sandbox Code Playgroud)