pymongo insert_one () TypeError при вставке документа со встроенными документами - PullRequest
0 голосов
/ 19 мая 2019

В моем скрипте я пытаюсь вставить один документ, используя 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 (с открытым соединением pymongo), я не получу ошибку. Ваша помощь очень ценится.

1 Ответ

0 голосов
/ 20 мая 2019

Сообщение об ошибке, с которым вы в данный момент сталкиваетесь, в основном дает вам понять, что вы не передаете dict или какую-либо из поддерживаемых структур данных.- Чтобы это работало, вам нужно изменить:

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) ...}
...