Django pymongo update_many ''不能使用(x.y)的(y)部分来遍历元素({x: []})'}'

问题描述 投票:0回答:1

我有一个这样的集合,其中包含示例文档:

[
  {
    "_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) 中测试了查询,它在那里工作得很好。那我做错了什么?

提前感谢您到目前为止阅读本文,也感谢您提出想法。

python django mongodb pymongo
1个回答
0
投票

这个答案的功劳完全归功于@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)

在这种情况下,问题中的查询将无需修改即可运行。

© www.soinside.com 2019 - 2024. All rights reserved.