首页 > 解决方案 > 无法使用 python (pymongo) 将 Jsonfile 插入 mongodb (错误:bson.errors.InvalidDocument:键 '$oid' 不能以 '$' 开头)

问题描述

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

[{
  "_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 '$' 尝试使用 pymongo 插入文档,但它仍然不起作用。

有人可以帮我吗?

点子列表

标签: python-3.xmongodbpymongobson

解决方案


MongoDB 使用扩展的 JSON 格式来表示标准 JSON 不支持的数据类型,例如ObjectID 。

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

MongoDB 还具有额外的字段名称限制,例如字段不能以美元符号开头。

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

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


推荐阅读