MongoDB更新$ pull运算符不会从数组中删除项

时间:2017-07-03 18:30:40

标签: mongodb

我在MongoDB中有一个集合。 并希望从数组中删除一个项目。

我的用户"集合是一个对象数组。

当我输入:

db.users.find({"tasks.task_id" : "h58sjIdj3jJZ"}).pretty()

在mongo shell中,我得到了这个结果:

{
  "_id" : ObjectId("5955b45b7a4bf40544019359"),
  "profile" : {
    "name" : "Morning bay",
    "email" : "morbay232@google.su",
    "phone" : "+1-641-155-88-84",
    "description" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit"
  },
  "tasks" : [
    {
      "task_id" : "h58sjIdj3jJY",
      "time" : "11:15 AM",
      "date" : "07/01/2017",
      "description" : "Make 1st call to John White"
    },
    {
      "task_id" : "h58sjIdj3jJZ",
      "time" : "14:30 PM",
      "date" : "07/09/2017",
      "description" : "Send certificate and make Another call to J.White"
    }
  ],
  "progress" : [
    {
      "isActive" : "",
      "description" : ""
    }
  ]
}

因此,我的收藏中的每个项目都是这样的。 没关系。

但是现在我想从"任务中删除一个项目"用户项目中的数组。

我输入:

db.users.update({}, {$pull : {"tasks" : {"task_id" : "h58sjIdj3jJZ"}}});

得到这个结果:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })

我阅读的文档和示例看起来很相似,所以我不明白哪里出错。

2 个答案:

答案 0 :(得分:1)

您在更新搜索查询中使用{}默认情况下表示find any document,然后您正在修改其任务列表{$pull : {"tasks" : {"task_id" : "h58sjIdj3jJZ"}}}

因此,可能正在修改另一个文档(可能包含也可能不包含id h58sjIdj3jJZ的任务,但在这种情况下,它是否具有相关性无关紧要)

您有两种选择: 使用方法:

db.users.update({}, {$pull : {"tasks" : {"task_id" : "h58sjIdj3jJZ"}}}, { multi: true });

最终会触及db中的每个文档,

OR

使搜索查询更具体(在任务中提供id或查找具有task_id的项目)

db.users.update({ "tasks.task_id": "h58sjIdj3jJZ"}, {$pull : {"tasks" : {"task_id" : "h58sjIdj3jJZ"}}});

答案 1 :(得分:0)

我在MongoDB Terminal Online上测试了它,你的查询正确地拉了文档。

这是output

您是否遇到过shell或使用ODM(如Mongoose)的问题?