使用PyMongo insert_one()插入含嵌入文档的文档时触发TypeError
解决PyMongo insert_one()插入含嵌入数组文档失败的问题
嘿,我一眼就看到问题出在哪了——你现在是把要插入的文档拼成了字符串,但PyMongo的insert_one()根本不接受字符串类型的参数!它要求传入的必须是字典(dict)、SON或者其他符合collections.MutableMapping的类型,这就是为什么你把print出来的字符串粘到Python shell里能行(shell会自动把字符串解析成字典),但脚本里直接传字符串就触发TypeError。
咱们来具体看你的代码:你构造doc的时候用了字符串拼接,比如:
doc = "{'id': " + str(u_id) + ", 'first': '" + str(first) + "', ...}"
这样得到的doc是一个纯字符串,不是Python字典,PyMongo自然不认。
给你两种解决办法,推荐第一种最安全可靠的:
方法一:直接构造Python字典(强烈推荐)
放弃字符串拼接,直接创建字典类型的文档,这是PyMongo最期待的方式,可读性强还不会出各种奇怪的语法问题:
# 替换原来的doc字符串拼接代码 doc = { 'id': u_id, 'first': first, 'last': last, # Python 3用f-string更简洁,Python 2就用format方法 'email': f"{first}.{last}@firma.de", 'previous_cars': [ {'make': make1, 'model': model1}, {'make': make2, 'model': model2} ] }
这样构造出来的doc是标准的字典类型,直接传给insert_one()就完全没问题了。
方法二:把字符串转成字典(不推荐,仅作参考)
如果你非要用字符串拼接的方式(真心不建议,容易踩坑),可以用eval()把字符串转换成字典,但要注意安全风险——eval()会执行字符串里的任意代码,如果你的数据里有不可信内容,这会很危险:
doc = eval("{'id': " + str(u_id) + ", 'first': '" + str(first) + "', 'last': '" + str(last) + "', 'email': '" + str(first) + "." + str(last) + "@firma.de', 'previous_cars': [{'make': '" + str(make1) + "', 'model': '" + str(model1) + "'},{'make': '" + str(make2) + "', 'model': '" + str(model2) + "'}]}")
而且如果你的名字里出现单引号(比如O'Neil),字符串拼接会直接语法报错,这也是为什么不推荐这种方式的原因。
把代码改成第一种方式后,再运行脚本,应该就能顺利插入所有文档啦。
内容的提问来源于stack exchange,提问作者Siedler
相关产品推荐
相关产品推荐

