我需要使用python将file.txt中的数据插入到新的MongoDB database.collection中。
.txt文件包含如下数据:
a={
"_id" : "67a2c0e2e559fb56bf055502",
"field1" : "value1",
"field2" : ["value21","value22"],
"field3" : {
"_id" : "37a2c0e2e559fb56bf055502",
"subfield1" : "subvalue1"
}
};
b={
"_id" : "67a2c0e2e559fb56bf055503",
"field1" : "value1",
"field2" : ["value21","value22"],
"field3" : {
"_id" : "27a2c0e2e559fb56bf055503",
"subfield1" : "subvalue1"
}
};
c={....
};
如果我们说a = doc1,b = doc2,C = doc3,d ...,我想插入所有文档。
我尝试使用l=split(read,';')
将其拆分为一个列表,然后使用insert_many将其添加到Mongo中,但出现此错误
TypeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a type that inherits from collections.MutableMapping
有什么方法可以在不创建json文件的情况下插入数据? 谢谢
代码
def insert():
client = pymongo.MongoClient(dbStringConnection)
db = client[dbName]
collectionR = db[dbCollection]
list1 = []
with open (file, 'r') as f:
reader= f.read()
#print (reader)
f.close()
reader= reader.replace('\n', '')
reader= reader.replace(' ','')
list1 = reader.split(';')
# print(list1[0])
list2={}
for i in range(len(lista)-1):
s=''
t=list1[i][0:1]
s=s+str(list1[i][2:len(list1[i])])
list2[t]=s
collectionR.insert_many(list2)
答案 0 :(得分:1)
collection.insert_many()需要一个字典列表,只需简单地将txt文件的内容加载到字符串中并在“;”上分割,就可以得到一个字符串列表,例如
'a={ "_id" : "67a2c0e2e559fb56bf055502", "field1" : "value1", "field2" : ["value21","value22"], "field3" : { "_id" : "37a2c0e2e559fb56bf055502", "subfield1" : "subvalue1" } }'
并且pymongo / mongodb不允许您插入字符串,它需要文档(python dict的文档)
请参见下文(使用insert_one
,但原理与insert_many
相同):
s = 'a={ "_id" : "67a2c0e2e559fb56bf055502", "field1" : "value1", "field2" : ["value21","value22"], "field3" : { "_id" : "37a2c0e2e559fb56bf055502", "subfield1" : "subvalue1" } }'
c.insert_one(s) # raise TypeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument,...
您需要实现的是将字符串加载到字典中:
dic = { "_id" : "67a2c0e2e559fb56bf055502", "field1" : "value1", "field2" : ["value21","value22"], "field3" : { "_id" : "37a2c0e2e559fb56bf055502", "subfield1" : "subvalue1" } }
c.insert_one(dic)
如果您设法将'a = {“ key1”:“ value1”,“ key2”:“ value2”}'这样的字符串转换为'{“ key1”:“ value1”,“ key2:value2” }”,则可以使用eval
将my_dict=eval('{"key1":"value1", "key2":"value2"}')
的字符串转换成字典
答案 1 :(得分:0)
非常感谢,我能够在MongoDB中插入数据
def insert():
client = pymongo.MongoClient(dbStringConnection)
db = client[dbName]
collectionR = db[dbCollection]
list1 = []
with open (file, 'r') as f:
reader= f.read()
f.close()
reader= reader.replace('\n', '')
reader= reader.replace(' ','')
list1 = reader.split(';')
for i in range(len(list1)-1):
my_dict={}
my_dict=eval((list1[i][2:len(list1[i])]))
collectionR.insert_one(my_dict)