【问题标题】:Python:error inserting json documents in mongodb collectionPython:在 mongodb 集合中插入 json 文档时出错
【发布时间】:2020-08-17 01:35:39
【问题描述】:

我是 pymongo 和 mongodb 的新手,我有一个包含 157 个文档的 json 文件,我想将它们插入一个名为 Students 的集合中。我逐行加载 json 文件并将每个文档导入一个名为 data 的列表中。然后我尝试在循环中使用 insert_one() 方法将每个文档插入到 Students 集合中,我得到了很多错误 json文件的格式为:

 //example of an entry 
{"_id":{"$oid":"5e99cb577a781a4aac69da3c"},"name":"Tanner Wilson","email":"tannerwilson@ontagene.com","yearOfBirth":{"$numberInt":"1962"},"address":[{"street":"Halsey Street","city":"Greenwich","postcode":{"$numberInt":"13832"}}]} 

我的代码:

import pymongo
from pymongo import MongoClient
import json 

client = MongoClient('localhost:27017')

db  = client['InfoSys']
collection=db['Students']
data=[]

with open('students.json') as f:
   for json_data in f:
       element =json.loads(json_data)
       data.append(element)

'''print(data)''' // the json data can be printed perfectly 

for k in data :
   collection.insert_one(k) //this is where the error happens 

我得到以下错误: File "C:\Users\User\Anaconda3\lib\site-packages\pymongo\collection.py", line 698, in insert_one session=session), File "C:\Users\User\Anaconda3\lib\site-packages\pymongo\collection.py", line 612, in _insert bypass_doc_val, session) File "C:\Users\User\Anaconda3\lib\site-packages\pymongo\collection.py", line 600, in _insert_one acknowledged, _insert_command, session) File "C:\Users\User\Anaconda3\lib\site-packages\pymongo\mongo_client.py", line 1491, in _retryable_write return self._retry_with_session(retryable, func, s, None) File "C:\Users\User\Anaconda3\lib\site-packages\pymongo\mongo_client.py", line 1384, in _retry_with_session return func(session, sock_info, retryable) File "C:\Users\User\Anaconda3\lib\site-packages\pymongo\collection.py", line 595, in _insert_command retryable_write=retryable_write) File "C:\Users\User\Anaconda3\lib\site-packages\pymongo\pool.py", line 618, in command self._raise_connection_failure(error) File "C:\Users\User\Anaconda3\lib\site-packages\pymongo\pool.py", line 613, in command user_fields=user_fields) File "C:\Users\User\Anaconda3\lib\site-packages\pymongo\network.py", line 129, in command codec_options, ctx=compression_ctx) File "C:\Users\User\Anaconda3\lib\site-packages\pymongo\message.py", line 707, in _op_msg flags, command, identifier, docs, check_keys, opts) bson.errors.InvalidDocument: key '$oid' must not start with '$'

感谢您帮助指导我解决此问题。

【问题讨论】:

    标签: python json mongodb file collections


    【解决方案1】:

    假设你有一个字符串格式的数据,你需要使用来自bson.json_util库的loads();例如

    from pymongo import MongoClient
    import bson.json_util
    
    client = MongoClient()
    
    db  = client['InfoSys']
    collection=db['Students']
    data='{"_id":{"$oid":"5e99cb577a781a4aac69da3c"},"name":"Tanner Wilson","email":"tannerwilson@ontagene.com","yearOfBirth":{"$numberInt":"1962"},"address":[{"street":"Halsey Street","city":"Greenwich","postcode":{"$numberInt":"13832"}}]}'
    collection.insert_one(bson.json_util.loads(data))
    print(collection.find_one())
    

    结果:

    {'_id': ObjectId('5e99cb577a781a4aac69da3c'), 'name': 'Tanner Wilson', 'email': 'tannerwilson@ontagene.com', 'yearOfBirth': 1962, 'address': [{'street': 'Halsey Street', 'city': 'Greenwich', 'postcode': 13832}]}
    

    【讨论】:

    • 我现在收到两行错误。我得到:`文件“C:\Users\User\Anaconda3\lib\site-packages\bson\json_util.py”,第 410 行,加载返回 json.loads(s, *args, **kwargs)` 和文件“C:\Users\User\Anaconda3\lib\json_init_.py”,第 341 行,在加载中引发 TypeError(f'JSON 对象必须是 str、bytes 或 bytearray,'TypeError: JSON 对象必须是 str、bytes 或 bytearray,而不是 list
    • 我的示例是针对单个记录。你得到那个工作了吗?一旦你有了这个工作,你需要迭代你的列表来加载每条记录。
    • 是的,我使用 for 循环遍历列表。具体来说,我在数据中为 k 写了:collection.insert_one(bson.json_util.loads(k))。新的错误是:在加载中引发 TypeError(f'JSON 对象必须是 str、字节或字节数组,'TypeError:JSON 对象必须是 str、字节或字节数组,而不是 dict,并且加载中的第二个错误返回 json.loads( s, *args, **kwargs)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多