Pymon go bulk_write upsert = True не работает для вставки нового документа - PullRequest
0 голосов
/ 23 марта 2020
Python 3.6.7
pymongo==3.10.1

Каждый раз, когда я запускаю свое приложение, мне нужно поддерживать определенную коллекцию. Мы можем изменить ранее загруженные данные, а также вставить новые.

У меня есть следующий код:

from pymongo import UpdateOne

COLLECTION_NAME = 'profile'

data = [
    UpdateOne(
        { "type": "user"},
        { "$set": { "order": 1 , "active": True, "name.pt_br": "usuário"} },
        upsert = True
    ),
    UpdateOne(
        { "type": "consultant"},
        { "$set": { "order": 2 , "active": True, "name.pt_br": "consultor"} },
        upsert = True
    ),
    UpdateOne(
        { "type": "business"},
        { "$set": { "order": 3 , "active": True, "name.pt_br": "gestor"} },
        upsert = True
    )
]

def load(db):

    db[COLLECTION_NAME].bulk_write(data)
    return True

Документы уже существуют внутри коллекции. Когда вызывается метод load(), я могу обновить любой атрибут.

Но если мне нужно добавить новый документ (тип: "x"), добавив его к data[], например:

data = [
    UpdateOne(
        { "type": "user"},
        { "$set": { "order": 1 , "active": True, "name.pt_br": "usuário"} },
        upsert = True
    ),
    UpdateOne(
        { "type": "consultant"},
        { "$set": { "order": 2 , "active": True, "name.pt_br": "consultor"} },
        upsert = True
    ),
    UpdateOne(
        { "type": "business"},
        { "$set": { "order": 3 , "active": True, "name.pt_br": "gestor"} },
        upsert = True
    ),
    UpdateOne(
        { "type": "x"},
        { "$set": { "order": 4 , "active": True, "name.pt_br": "x"} },
        upsert = True
    )
]

Я получаю следующую ошибку:

  File "/data/dev/python/myapp/software/app/lib/storages/mongodb/dataLoad/profile.py", line 30, in load
    db[COLLECTION_NAME].bulk_write(data)
  File "/home/kleysonr/.virtualenvs/graphql/lib/python3.6/site-packages/pymongo/collection.py", line 502, in bulk_write
    bulk_api_result = blk.execute(write_concern, session)
  File "/home/kleysonr/.virtualenvs/graphql/lib/python3.6/site-packages/pymongo/bulk.py", line 511, in execute
    return self.execute_command(generator, write_concern, session)
  File "/home/kleysonr/.virtualenvs/graphql/lib/python3.6/site-packages/pymongo/bulk.py", line 349, in execute_command
    _raise_bulk_write_error(full_result)
  File "/home/kleysonr/.virtualenvs/graphql/lib/python3.6/site-packages/pymongo/bulk.py", line 140, in _raise_bulk_write_error
    raise BulkWriteError(full_result)
pymongo.errors.BulkWriteError: batch op errors occurred

Как выполнить вставку / обновление на основе переменной data[]?

1 Ответ

0 голосов
/ 23 марта 2020

Вы должны уловить ошибку, чтобы выяснить, что происходит не так.

from pymongo.errors import BulkWriteError

def load(db):

    try:
        db[COLLECTION_NAME].bulk_write(data)
        return True
    except BulkWriteError as e:
        write_errors = e.details.get('writeErrors')
        print(write_errors)
...