Node.js “问题”;updateMany“;及$拉;关于数组属性
我的mongodb中有以下对象: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=" ]
{
"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”…
vsitem.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
在这里也非常无用,所以我可以删除它。