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

mongodb $pull doesn't work with array in subdocument

我对 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 return 我这个:

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,我验证了要删除的值。

任何人都可以有想法吗?

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

一个任务ID不能在2个位置,它属于1个而且只有1个仪表板。所以如果你提出这样的请求:

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

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

您将需要 select 使用 "$elemMatch" 的特定数组元素,像这样

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

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