簡體   English   中英

Python:在 mongodb 集合中插入 json 文檔時出錯

[英]Python:error inserting json documents in mongodb collection

我是 pymongo 和 mongodb 的新手,我有一個 json 文件,其中包含 157 個文檔,我想將這些文檔插入一個名為 Student 的集合中。 我逐行加載 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 '$' 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 '$'

感謝您幫助指導我解決此問題。

假設您有字符串格式的數據,您需要使用bson.json_util庫中的 loading 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}]}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM