pymongo insert_one()插入带有嵌入式文档的文档时发生TypeError

时间:2019-05-19 15:36:35

标签: python json pymongo bson

在我的脚本中,我试图使用pymongo从脚本中插入一个文档。该文档还包含数组或嵌入式文档。在Mongo客户端中直接运行此代码时,它可以工作。在脚本中没有。

我将MongoDB 4.08与pymongo 3.8.0结合使用,并在python 2.7.10和3.7.3上都进行了尝试。

这是我要插入的文档:

{'id': 84646995, 'first': 'AAA', 'last': 'YYY', 'email': 'AAA.YYY@domain.com', 'previous_cars': [{'make': 'BMW', 'model': 'model2'},{'make': 'Mercedes', 'model': 'model1'}]}

该脚本的目的是一次创建一个测试数据,一次创建一个文档,然后将其插入到收集用户中。

import pymongo
import random

client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.user # db user with a collection called user

first_names = ["AAA", "BBB", "CCC"]
last_names = ["XXX", "YYY", "ZZZ"]
make_list = ["Audi", "BMW", "Mercedes"]
model_list = ["model1", "model2", "model3"]
total = 0

for x in range(10):
    u_id = random.randint(10000000, 99999999)
    first = random.choice(first_names)
    last = random.choice(last_names)
    make1 = random.choice(make_list)
    make2 = random.choice(make_list)
    model1 = random.choice(model_list)
    model2 = random.choice(model_list)

    doc = "{'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) + "'}]}"

    print(doc)

    db.user.insert_one(doc)
    total += 1

print("Done. Inserted " + str(total) + " documents.")

我得到的错误:

TypeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a type that inherits from collections.MutableMapping

如果我将print(doc)的输出粘贴到python shell(具有打开的pymongo连接)中,则不会出错。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您当前遇到的错误消息基本上是让您知道您没有传递字典或任何受支持的数据结构。 -为了使其正常工作,您需要进行以下更改:

doc = "{'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) + "'}]}"

进入以下内容:

doc = {'id': str(u_id) ...}