Python pymongo问题:TypeError:文档必须是dict的实例,bson.son.son

Python pymongo问题:TypeError:文档必须是dict的实例,bson.son.son,python,file,ubuntu,websocket,pymongo,Python,File,Ubuntu,Websocket,Pymongo,我尝试将一些用户信息插入到我的数据库中,因此我使用python创建了两个脚本,第一个是服务器,它仍然能够唤醒并侦听每个连接的新客户端,并且能够读取用户数据(从客户端应用程序读取数据),最后将数据写入文件.txt和第二个脚本,能够读取文件.txt中存储的数据,并最终将其插入我的Mongo数据库 这是我要插入的数据示例: {"id":"12345", "user":"someone2021", "full n

我尝试将一些用户信息插入到我的数据库中,因此我使用python创建了两个脚本,第一个是服务器,它仍然能够唤醒并侦听每个连接的新客户端,并且能够读取用户数据(从客户端应用程序读取数据),最后将数据写入
文件.txt
和第二个脚本,能够读取
文件.txt中存储的数据,并最终将其插入我的Mongo数据库

这是我要插入的数据示例:

 {"id":"12345", "user":"someone2021", "full name":"someone full name", "email":"someone@mail.com", "phone":"xxxxxxxx", "password":"*********"}
因此,在服务器端,我创建了以下脚本:

Server.py

import socket
port = 80
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostname()
s.bind((host, port))
s.listen(5)

print("******************************")
print("server listening...")

while True:
    client, adr = s.accept()
    print(f"got connection from ",adr)
    data = client.recv(1024)

    if (data.decode("utf-8")!= None):
        with open('user.txt', 'w') as writer:
             writer.write(data.decode("utf-8"))
    client.close()
对于服务器脚本,我没有任何问题,一切正常,下面是user.txt文件结果:

最后是将数据插入数据库脚本:

插入tomongodb.py

import pymongo

myclient = pymongo.MongoClient()
mydb = myclient["CompanyProject"]
mycol = mydb["Clients"]

str =""
with open('user.txt', 'r') as reader:
        for i in reader:
                str += i
info={ str }

x = mycol.insert_one(info)
f = open("id.txt","wb")
f.write("The object id: ",x.inserted_ids)
print(x.inserted_ids)
此脚本在输出错误下方始终显示一个错误:

    x = mycol.insert_one(info)
  File "/home/ubuntu/.local/lib/python3.8/site-packages/pymongo/collection.py", line 692, in insert_one
    common.validate_is_document_type("document", document)
  File "/home/ubuntu/.local/lib/python3.8/site-packages/pymongo/common.py", line 502, in validate_is_document_type
    raise TypeError("%s must be an instance of dict, bson.son.SON, "
TypeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a type that inherits from collections.MutableMapping

我在我的工作中使用的是Ubuntu 20操作系统和Python 3.8。

使用
info={str}
不会创建
dict
,而是
set
,因此您会收到此错误消息。此外,当从文件中读取时,您将始终获得字符串。此外,根据您的屏幕截图,字符串不是有效的dict,因此您需要手动解析它们

您应该使用编码和解析功能。就我个人而言,我会使用
json
转储和解析数据,但如果您想保留代码,可以在
InsertToMongoDB.py
中尝试:

# supposing you have multiple lines in user.txt file
data = []
with open('user.txt', 'r') as reader:
    for row in reader.readlines():
        data_dict = {}
        for key_val, in row.replace('"', "").split(','):
            for i in key_val.split(":"):
                key = i[0].strip() # remove trailing space
                val = i[1]
                data_dict[key] = val
        data.append(data_dict)

for i in data:
    x = mycol.insert_one(i)

问题是输入类型是集合而不是dict,这在Mongo中是不可接受的

所以要解决这个问题,你需要将字符串数据转换成dict,在python中有一个函数名为name
eval()
可以很容易地将字符串值转换成dict,但是需要考虑你想要转换的数据的形式,也就是说,你需要在字符串的第一个和最后添加
{}
,否则,您将得到一个错误。 因此,对于字符串数据,您需要向服务器发送以下格式的字符串:

{"id":"12345", "user":"someone2021", "full name":"someone full name", "email":"someone@mail.com", "phone":"xxxxxxxx", "password":"*********"}
最后,
InsertToMongoDB.py
脚本应该如下所示:

import pymongo

myclient = pymongo.MongoClient()
mydb = myclient["CompanyProject"]
mycol = mydb["Clients"]

strData = ''
with open('user.txt', 'r') as reader:
    for i in reader:
        strData += i
str_dict = eval(strData)
print(str_dict)
x = mycol.insert_one(data_dict).inserted_id
f = open("id.txt","wb")
f.write("The object id: ",x.inserted_ids)
print(x.inserted_ids)
现在,如果要读取特殊数据,例如用户名,只需编写以下代码:

print(str_dict['user'])

你是对的,问题在于数据的类型不是dict,但简单的方法是直接将文件添加到data_dict中。我添加了一个答案,这是我的工作和解决问题,无论如何谢谢你给我一个解决问题的想法。