首页 > 解决方案 > 使用 mongoose 通过 Id 查找和删除数组中的子文档

问题描述

我正在尝试使用 Mongoose 删除数组中的子文档。

我的数据:

{
    "_id": {
        "$oid": "5d88dfe45feb4c06a5cfb762"
    },
    "spaces": [{
        "_id": {
            "$oid": "5d88dfe45feb4c06a5cfb76f"
        },
        "name": "Building 2",
        "subSpace": [{
            "_id": {
                "$oid": "5d88dfe45feb4c06a5cfb771"
            },
            "name": "Basement"
        }, {
            "_id": {
                "$oid": "5d88dfe45feb4c06a5cfb770"
            },
            "name": "Floors"
        }]
    }, {
        "_id": {
            "$oid": "5d88dfe45feb4c06a5cfb76c"
        },
        "name": "Building 4",
        "subSpace": [{
            "_id": {
                "$oid": "5d88dfe45feb4c06a5cfb76e"
            },
            "name": "Basement"
        }, {
            "_id": {
                "$oid": "5d88dfe45feb4c06a5cfb76d"
            },
            "name": "Floors"
        }]
    }]
}

对于此示例,我们要删除Building 2中具有以下 _id的 subSpace Floors : 5d88dfe45feb4c06a5cfb771

我的代码(在模型中):

exports.removeSubSpaceById = (subSpaceId) => {
    Residence.findOneAndUpdate( { "spaces.subSpace._id": '5d88dfe45feb4c06a5cfb771' },
        { $pull: 
        { spaces: 
        { subSpace: 
        { _id: '5d88dfe45feb4c06a5cfb771' }}}}, function(err, result) {
            console.log(result);
    })
};

输出:console.log:我的整个文档但是 subSpace/Basement ( 5d88dfe45feb4c06a5cfb771 ) 仍在我的文档中。

谢谢你的帮助。

标签: node.jsmongodbmongoose

解决方案


使用位置运算符进行嵌套数组操作。MongoDb 文档

exports.removeSubSpaceById = (subSpaceId) => {
Residence.findOneAndUpdate({ "spaces._id": '5d88dfe45feb4c06a5cfb76f' },
    {
        $pull:
        {
            "spaces.$.subSpace": { _id: "5d88dfe45feb4c06a5cfb771" }
        }
    }, function (err, result) {
        console.log(result);
    })

}


推荐阅读