【问题标题】:Unable to insert Jsonfile into mongodb using python (pymongo) (Error: bson.errors.InvalidDocument: key '$oid' must not start with '$')无法使用 python (pymongo) 将 Jsonfile 插入 mongodb(错误:bson.errors.InvalidDocument:键 '$oid' 不能以 '$' 开头)
【发布时间】:2021-05-24 08:00:30
【问题描述】:

我有一个需要使用 python 插入 MongoDB 的 json 文件。在我的 json 文件中,我有以下 sn-p: 文件名:角色

[{
  "_id": {
    "$oid": "1a2e34r6hyhujujikijk"
  },
  "sequence": 255559,
  "name": "cruisemethods",
  "createdAt": {
    "$date": "2020-03-31T02:37:21.716Z"
  },
  "updatedAt": {
    "$date": "2020-08-27T14:04:59.333Z"
  },
  "__v": 0
}]%

当我尝试插入上述 json(在文件中)时,它会为 objectid 和 date 引发错误: bson.errors.InvalidDocument: key '$oid' must not start with '$'

我的代码:

import json
from pymongo import MongoClient
client = MongoClient('URL')
Dictionarysample = {'DBname':'collectionname'};
def func(db_name, col_name):
    dbid = getattr(client,db_name)
    collection = getattr(dbid,col_name)
    with open('Filepath') as file:
        file_data = json.load(file)
        if isinstance(file_data, list):
              collection.insert_many(file_data)
        else:
              collection.insert_one(file_data)
for key in Dictionarysample:
    func(key,Dictionarysample[key])

版本

python: Python 3.8.2
pymongo: pymongo 3.11.3
MongodAtlas: Version 4.4.3

尝试了几乎所有现有的 stackoverflow 建议 bson.errors.InvalidDocument: key '$oid' must not start with '$' trying to insert document with pymongo,但还是不行。

有人可以帮我解决这个问题吗?

pip list

【问题讨论】:

  • 我能想到它不起作用的唯一原因是您使用的是来自Json 包的json.load(file),而不是您标记的帖子中建议的bson.json_util

标签: python-3.x mongodb pymongo bson


【解决方案1】:

MongoDB 使用 extended JSON format 来表示标准 JSON 不支持的数据类型,例如 ObjectID

对象{ "$oid": "1a2e34r6hyhujujikijk" }(顺便说一下,这不是一个有效的ObjectID)应该在提交到mongod节点之前转换为ObjectID

MongoDB 还具有额外的field name restrictions,例如字段可能不以美元符号开头。

您使用的标准 JSON 解析器不知道 MongoDB 扩展或限制。

您可以考虑使用 pymongo 的 bson.json_util 自动处理这些问题。

【讨论】:

  • 我尝试使用 bson.json_util 我得到以下错误 Traceback (最近一次调用最后): File "mongo.py", line 27, in func(key,Dictionarysample[key])文件“mongo.py”,第 11 行,在 func file_data = bson.json_util.loads(file) NameError: name 'bson' is not defined 我已经安装了 bson,我也遵循了这些步骤 pip uninstall bson pip uninstall pymongo点安装 pymongo。 asper stackoverflow 结果
  • 你先导入bson了吗?
猜你喜欢
  • 2017-06-24
  • 2013-11-07
  • 2017-03-28
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 2015-11-17
相关资源
最近更新 更多