首页 > 解决方案 > 删除 mongodb 中对象数组中的特定对象,按 id,而不是索引。- 不删除

问题描述

我有一个包含对象数组的集合 - 每个对象都有一个唯一的 ID - 我希望能够从数组中删除一个项目 - 或特定的记录。我的代码不会出错 - 但它不会从数组中删除对象。

馆藏结构

_id: 
,username: 
,prefs: [
    _id:
    ,title: 
]

数据看起来像

_id: 5a...46,
username: "bobsmith",
prefs: [
    {
        _id: 5...a,
        composition_title: "blah 1"
    }

    ,{
        _id: 5 c...2,
        composition_title: "blah 2"
    }

    ,{
        _id: 5 c...c,
        composition_title: "blah 3"
    }
]

代码:

module.exports.removeUserPref = function (uid, pid, callback) {

    User.update(
        {
            '_id': mongoose.Types.ObjectId(uid)
        },
        {
            $pull: { pref: { $elemMatch: { _id: mongoose.Types.ObjectId(pid) } } }
        }
    , callback);

}

我知道我传递的用户 ID 是正确的,并且我传递的 Pref Id 在数组中是正确的 - 但我的响应是:“nModified”:0 并且没有删除的项目

{
    "n": 1,
    "nModified": 0,
    "opTime": {
        "ts": "6641391849170796549",
        "t": 4
    },
    "electionId": "7fffffff0000000000000004",
    "ok": 1,
    "operationTime": "6641391849170796549",
    "$clusterTime": {
        "clusterTime": "6641391849170796549",
        "signature": {
            "hash": "sBXjaw1nw99+cfMIMVNq5KtCpt8=",
            "keyId": "6596828466803376130"
        }
    }
}

标签: mongodbmongoosemongodb-query

解决方案


$elemMatch是一个queryprojection运算符。与 .没有任何关系update operators

所以改为尝试做这样的事情

User.update(
  { "_id": mongoose.Types.ObjectId(uid) },
  { "$pull": { "pref": { "_id": mongoose.Types.ObjectId(pid) } } }
)

推荐阅读