Node.js “问题”;updateMany“;及$拉;关于数组属性

Node.js “问题”;updateMany“;及$拉;关于数组属性,node.js,arrays,mongodb,insert-update,upsert,Node.js,Arrays,Mongodb,Insert Update,Upsert,我的mongodb中有以下对象: { "item": { "id": "/Ed/6wigZ9LTLs2mPDWDzOFD/he0vbUEvQBl2Bga/T8=", "status": { "likes": [ "HU0HKFoL2YQuQ2WrYhj0rYoFbRkwJ0EJEf4ML7vAp2Q=" ]

我的mongodb中有以下对象:

{ 
  "item": {
    "id": "/Ed/6wigZ9LTLs2mPDWDzOFD/he0vbUEvQBl2Bga/T8=",
    "status": {
      "likes": [
        "HU0HKFoL2YQuQ2WrYhj0rYoFbRkwJ0EJEf4ML7vAp2Q="
      ]
    }
  }
}
现在我想更新我的集合,并从集合中所有在其
项.status.liles
数组中具有此值的文档中提取值“/Ed/6wigZ9LTLs2mPDWDzOFD/he0vbUEvQBl2Bga/T8=”

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

db.getCollection('mycollection').update({"item.status.likes": "/Ed/6wigZ9LTLs2mPDWDzOFD/he0vbUEvQBl2Bga/T8=" }, { "$pull":{"item.status.likes": "/Ed/6wigZ9LTLs2mPDWDzOFD/he0vbUEvQBl2Bga/T8="}})
当我执行命令时,
在2ms内更新了0条记录(这是正确的,因为没有文档匹配)

现在,当我在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:无法将$pull应用于非数组值

如果我将其更改为:

collection.updateMany({}, obj, { upsert: true }, (err, info) => {...});
我没有错。这让我相信“无过滤器”和“空结果集”之间有区别,而$pull对后者不起作用


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

由于
upsert:true
的原因,当没有单个文档匹配筛选器时,就会发生错误

它告诉mongo插入一个新文档,其中包含过滤器中的字段,从而生成以下文档:

{ 
  "item": {
    "status": {
      "likes": "/Ed/6wigZ9LTLs2mPDWDzOFD/he0vbUEvQBl2Bga/T8="
    }
  }
}
然后,它尝试将更新应用于此文档,并在字符串上调用$pull,这将导致错误


Robo3T版本之所以有效,是因为默认情况下更新是
upsert:false

您确定要从likes中提取
/Ed/6wigZ9LTLs2mPDWDzOFD/he0vbUEvQBl2Bga/T8=
?它不存在。iI的项目id。在示例文档中,可以从likes中提取的唯一项目是
hu0hkfol2yquwryhj0ryofbrkwj0ejef4ml7vap2q=/code>>。是的。用例是“从所有在其“likes”数组中包含“my id”的文档中删除“my id”。在上面的示例中,没有匹配的其他文档,因此,我得到了错误。一旦我将筛选器更改为
{}
或者在
likes
-数组中添加第二个文档,其中包含
/Ed/6wigZ9LTLs2mPDWDzOFD/he0vbUEvQBl2Bga/T8=
,它可以工作。但是对于我的实现,它必须与空结果集一起工作,因为这通常是这样。谢谢,已经工作了。事实上
upsert:true
在这里也非常无用,所以我可以删除它。