Как вставить_many, предотвращая дублирование записей, где ключ, отличный от _id, рассматривается как первичный ключ? - PullRequest
0 голосов
/ 20 марта 2020

У меня есть существующая коллекция MongoDB, где каждый документ похож на -

{
    "_id":"5e7467b76fbf38cd13c4f322",
    "Revision":"HEXDEF",
    "Variant":"2800",
}

Я хочу использовать insert_many для вставки массива формы, скажем -

data = [
    {
        "Revision":"ABXDEF",
        "Variant":"1800",
    },
    {
        "Revision":"HEXDEF",
        "Variant":"2400",
    }
]

Здесь я рассматриваю Revision как мой первичный ключ и не хочет вставлять запись с этим Revison, если она уже существует. Как правильно достичь этого?

В настоящее время мой запрос MongoDB - -

db[collection].insert_many(data)

1 Ответ

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

У вас есть два варианта; либо используйте _id вместо ревизии, либо создайте уникальный индекс. Я предпочитаю последний подход. Этот пример кода может помочь:

from pymongo import MongoClient
from pymongo.errors import BulkWriteError

db = MongoClient()['mydatabase']
db.mycollection.create_index('Revision', unique=True)
data = [
    {
        "Revision":"ABXDEF",
        "Variant":"1800",
    },
    {
        "Revision":"HEXDEF",
        "Variant":"2400",
    },
    {
        "Revision": "ABXDEF",
        "Variant": "2700",
    },
    {
        "Revision": "ZZZZZZ",
        "Variant": "3000",
    }
]

# ordered=True (default) will stop writing on an error (only 2 records added)
# ordered=False will continue after with any subsequent inserts after the error
try:
    result = db.mycollection.insert_many(data, ordered=True)
    print (f'All ok - {result.nInserted} records inserted')
except BulkWriteError as e:
    writeErrors = e.details.get('writeErrors')
    print (f"{len(writeErrors)} WriteErrors and {e.details.get('nInserted')} records inserted")
    print(writeErrors)
...