You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:36:32