mongodb $ pull不适用于子文档中的数组

时间:2018-03-15 13:59:15

标签: node.js mongodb node-mongodb-native

使用MongoDB进行更新时遇到问题。

我的架构如下所示:

Project: {
    _id: ObjectId(pro_id)
    // some data
    dashboard_group: [
        {
            _id: ObjectId(dgr_id)
            dgr_name: "My Dashboard"
            dgr_tasks: [
                id1,
                id2,
                ...
            ]
        },
        // other dashboards
    ]
}

我想删除id2,但$ pull运算符似乎不起作用。 Mongo回复了我:

result: {
    lastErrorObject: {
        n: 1,
        updatedExisting: true
    },
    ok: 1
}

这是我的要求:

db.Project.findOneAndUpdate({
    "dashboard_group._id": dgr_id
}, {
    $pull: {
        "dashboard_group.$.dgr_tasks": id2
    }
});

dgr_id在查询之前已经转换为ObjectId,我验证了我要删除的值。

任何人都可以有想法吗?

2 个答案:

答案 0 :(得分:0)

所以,我找到了一个带有$[]标识符的解决方案。这不是它的基本功能,但它适合我的情况。

任务ID不能位于2位置,它属于1且只有1个仪表板。因此,如果您提出以下请求:

db.Project.findOneAndModify({
    "dashboard_group._id": dgr_id
}, {
    $pull: {
        "dashboard_group.$[].dgr_tasks": id2   
    }
});

Mongo将删除与id2匹配的所有值。如果没有{multi: true}选项,它将进行一次更新,我的项目确实从我的嵌套数组中删除。

答案 1 :(得分:0)

您需要使用"$elemMatch"这样的

选择特定的数组元素

查询:{"dashboard_group":{"$elemMatch":{dgr_name:"My Dashboard"}}}

更新:{$pull:{"dashboard_group.$.dgr_tasks":"id2"}}