我有一个这样的集合,其中包含示例文档:
[
{
"_id": {
"$oid": "64b28bafb2ea43dd940b920d"
},
"title": "Village Libraries",
"keywords": {
"bn": [
{
"$ref": "mcoll_keywords",
"$id": {
"$oid": "64b28badb2ea43dd940b920b"
}
}
],
"en": [
{
"$ref": "mcoll_keywords",
"$id": {
"$oid": "64b28aacb2ea43dd940b920a"
}
}
]
}
},
{
"_id": {
"$oid": "64b676b3b2ea43dd940b9230"
},
"title": "Folk Tales",
"keywords": {
"bn": [
{
"$ref": "mcoll_keywords",
"$id": {
"$oid": "64b67683b2ea43dd940b922d"
}
}
],
"en": [
{
"$ref": "mcoll_keywords",
"$id": {
"$oid": "64b676afb2ea43dd940b922e"
}
}
]
}
}
]
我想对此集合运行多重更新查询(使用 Python(Django 和 pymongo)),例如:
db.collection.update({},
{
"$pull": {
"keywords.bn": {
"$id": ObjectId("64b67683b2ea43dd940b922d")
}
}
},
{
"multi": true
})
但是运行更新查询:
...
from pymongo import MongoClient
...
print('q= '+str({'$pull': {'keywords.bn': {'$id': meta_bid}}}))
# OUTPUT: q= {'$pull': {'keywords.bn': {'$id': ObjectId('64b67683b2ea43dd940b922d')}}}
y= ent_col.update_many({}, {'$pull': {'keywords.bn': {'$id' : meta_bid}}})
导致以下错误:
完整错误:{'index':0,'code':28,'errmsg':'无法使用该部分 (bn) of (keywords.bn) 遍历元素 ({keywords: []})'}
我已经在 Mongo Playground (link) 中测试了查询,它在那里工作得很好。那我做错了什么?
提前感谢您到目前为止阅读本文,也感谢您提出想法。
这个答案的功劳完全归功于@cmgchess 对这个问题的评论。将查询更改为:
y= ent_col.update_many({'keywords': {'$ne': []}}, {'$pull': {'keywords.bn': {'$id' : meta_bid}}}, upsert=False)
完成了工作。
问题是在某些文档中“关键字”的值是
[]
。
作为替代方案,可以将值为
[]
的“关键字”更新为 {'bn': [], 'en': []}
,并以同样方式更新文档插入/更新代码(不要将“关键字”设置为 []
)。示例更新代码如下:
x= ent_col.update_many({'keywords': {'bn': [], 'en': []}}, {'$set': {'keywords': []}}, upsert=False)
在这种情况下,问题中的查询将无需修改即可运行。