"updateMany" 和数组属性上的“$pull”的问题

Problems with "updateMany" and "$pull" on array properties

我的 mongodb 中有以下对象:

{ 
  "item": {
    "id": "/Ed/6wigZ9LTLs2mPDWDzOFD/he0vbUEvQBl2Bga/T8=",
    "status": {
      "likes": [
        "HU0HKFoL2YQuQ2WrYhj0rYoFbRkwJ0EJEf4ML7vAp2Q="
      ]
    }
  }
}

现在我想更新我的集合,并从集合中所有在 item.status.liles 数组中具有此值的文档中提取值“/Ed/6wigZ9LTLs2mPDWDzOFD/he0vbUEvQBl2Bga/T8=”。

当我使用工具Robo 3T时,我可以在命令行中输入:

db.getCollection('mycollection').update({"item.status.likes": "/Ed/6wigZ9LTLs2mPDWDzOFD/he0vbUEvQBl2Bga/T8=" }, { "$pull":{"item.status.likes": "/Ed/6wigZ9LTLs2mPDWDzOFD/he0vbUEvQBl2Bga/T8="}})

当我执行命令时它说 Updated 0 record(s) in 2ms(这是正确的,因为没有文档匹配)。

现在,当我在 Node.JS 代码中执行相同操作时,如下所示:

let filter = {item.status.likes: '/Ed/6wigZ9LTLs2mPDWDzOFD/he0vbUEvQBl2Bga/T8='};
let obj = {"$pull":{"item.status.likes":"/Ed/6wigZ9LTLs2mPDWDzOFD/he0vbUEvQBl2Bga/T8="}}

collection.updateMany(filter, obj, { upsert: true }, (err, info) => {...});

我得到的是 MongoError: Cannot apply $pull to a non-array value

如果我把它改成:

collection.updateMany({}, obj, { upsert: true }, (err, info) => {...});

我没有收到任何错误。这让我相信“无过滤器”和“空结果集”是有区别的,$pull 对后者不起作用。

这是为什么?我还尝试了不同的“$pull”语法(例如 {"item":{"status":{"likes"...item.status.likes),但这并没有改变任何东西。

由于 upsert: true.

没有单个文档匹配过滤器时会发生错误

它告诉 mongo 使用过滤器中的字段插入一个新文档,这使得以下文档:

{ 
  "item": {
    "status": {
      "likes": "/Ed/6wigZ9LTLs2mPDWDzOFD/he0vbUEvQBl2Bga/T8="
    }
  }
}

然后它尝试将更新应用到此文档,在导致错误的字符串上调用 $pull。

Robo3T 版本有效,因为更新默认为 upsert: false