如何从Mongodb数组文档中删除项目

时间:2016-05-30 07:06:45

标签: javascript mongodb

我有以下名为Posts的mongodb集合,其文档如下:

{
    "_id" : "111",
    "comments" : [
        {
            "replyPost" : "aaaa",
            "username" : "John Doe"
        },
        {
            "replyPost" : "bbbb",
            "username" : "Jane Smith"
        },
        {
            "replyPost" : "cccc",
            "username" : "Jane Smith"
        },
        {
            "replyPost" : "dddd",
            "username" : "Jane Smith"
        }
    ]
}

我正在尝试使用replyPost删除数组项:“cccc”,结果将是:

{
    "_id" : "111",
    "comments" : [
        {
            "replyPost" : "aaaa",
            "username" : "John Doe"
        },
        {
            "replyPost" : "bbbb",
            "username" : "Jane Smith"
        },
        {
            "replyPost" : "dddd",
            "username" : "Jane Smith"
        }
    ]
}

我尝试使用$ pull参考mongodb文件的.update方法 https://docs.mongodb.com/manual/reference/operator/update/pull/

Posts.update(
  {_id: this._id},
  { $pull: { comments: { replyPost:"cccc"} } }
);

似乎没有用。有谁能看到问题?

3 个答案:

答案 0 :(得分:0)

看看你是否得到了正确的_id。它是字符串格式。

我在mongo shell中尝试过相同的操作。它对我有用。

这是日志:

> db.posts.insert({
...     "_id" : "111",
...     "comments" : [
...         {
...             "replyPost" : "aaaa",
...             "username" : "John Doe"
...         },
...         {
...             "replyPost" : "bbbb",
...             "username" : "Jane Smith"
...         },
...         {
...             "replyPost" : "cccc",
...             "username" : "Jane Smith"
...         },
...         {
...             "replyPost" : "dddd",
...             "username" : "Jane Smith"
...         }
...     ]
... })
WriteResult({ "nInserted" : 1 })
> db.posts.update({_id:'111'},{$pull:{comments:{replyPost:'cccc'}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.posts.findOne()
{
        "_id" : "111",
        "comments" : [
                {
                        "replyPost" : "aaaa",
                        "username" : "John Doe"
                },
                {
                        "replyPost" : "bbbb",
                        "username" : "Jane Smith"
                },
                {
                        "replyPost" : "dddd",
                        "username" : "Jane Smith"
                }
        ]
}

答案 1 :(得分:0)

如果你使用的是猫鼬,你可以这样做:

db.posts.remove({replyPost: 'cccc'}, function(err) {
})

第一个参数可以是任何mongoose查询表达式。所有匹配都将从db中删除。

请参阅mongoose remove

答案 2 :(得分:0)

经过测试的作品:

Posts.update((
  {"_id" : "111"},
  { $pull: {comments: {"replyPost" : "cccc"}} },
  { multi: true }
)