"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
。
我的 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
。