Python:在mongodb集合中插入json文档时出错



我是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:UsersUserAnaconda3libsite-packagespymongocollection.py", line 698, in insert_one session=session), File "C:UsersUserAnaconda3libsite-packagespymongocollection.py", line 612, in _insert bypass_doc_val, session) File "C:UsersUserAnaconda3libsite-packagespymongocollection.py", line 600, in _insert_one acknowledged, _insert_command, session) File "C:UsersUserAnaconda3libsite-packagespymongomongo_client.py", line 1491, in _retryable_write return self._retry_with_session(retryable, func, s, None) File "C:UsersUserAnaconda3libsite-packagespymongomongo_client.py", line 1384, in _retry_with_session return func(session, sock_info, retryable) File "C:UsersUserAnaconda3libsite-packagespymongocollection.py", line 595, in _insert_command retryable_write=retryable_write) File "C:UsersUserAnaconda3libsite-packagespymongopool.py", line 618, in command self._raise_connection_failure(error) File "C:UsersUserAnaconda3libsite-packagespymongopool.py", line 613, in command user_fields=user_fields) File "C:UsersUserAnaconda3libsite-packagespymongonetwork.py", line 129, in command codec_options, ctx=compression_ctx) File "C:UsersUserAnaconda3libsite-packagespymongomessage.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库中的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}]}

最新更新