通过id而不是index删除mongodb中对象数组内的特定对象。 -不删除

时间:2019-01-01 05:32:56

标签: mongodb mongoose mongodb-query

我有一个集合,其中包含一个对象数组-每个对象都有一个唯一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是正确的,我要传递的首选ID是数组中的IS-但我的响应是:“ 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"
        }
    }
}

1 个答案:

答案 0 :(得分:1)

$elemMatchqueryprojection运算符。与update operators无关。

所以尝试做这样的事情

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