2017-06-17 24 views
1

Ich möchte insert_many() Dokumente in meiner Sammlung. Einige von ihnen können das gleiche Schlüssel/Wert-Paar (screen_name in meinem Beispiel) als vorhandene Dokumente innerhalb der Sammlung haben. Ich habe einen eindeutigen Index für diesen Schlüssel, daher bekomme ich einen Fehler.Pymongo: insert_many + eindeutigen Index

my_collection.create_index("screen_name", unique = True) 

my_collection.insert_one({"screen_name":"user1", "foobar":"lalala"}) 
# no problem 

to_insert = [ 
    {"screen_name":"user1", "foobar":"foo"}, 
    {"screen_name":"user2", "foobar":"bar"} 
] 
my_collection.insert_many(to_insert) 

# error : 
# File "C:\Program Files\Python\Anaconda3\lib\site-packages\pymongo\bulk.py", line 331, in execute_command 
# raise BulkWriteError(full_result) 
# 
# BulkWriteError: batch op errors occurred 

Ich mag an würde:

  1. Nicht einen Fehler
  2. nicht die bereits vorhandenen Dokumente (hier {"screen_name":"user1", "foobar":"lalala"}) ändern bekommen
  3. Legen Sie alle nicht-vorhandene Dokumente (hier, {"screen_name":"user2", "foobar":"bar"})

Edit: Wie jemand in Kommentar sagte "diese Frage fragt, wie man eine Bulk einfügen und ignorieren einzigartige Index-Fehler, während immer noch die erfolgreichen Datensätze einfügen. . So ist es kein Duplikat mit der Frage, wie kann ich Masseneinfügung tun“Bitte öffnen Sie es

Antwort

3

Eine Lösung der ordered Parameter von insert_many verwenden könnte und legen Sie es auf False (Standard ist True).

my_collection.insert_many(to_insert, ordered=False) 

From the PyMongo documentation:

bestellt (optional): Wenn True (Standardeinstellung) Dokumenteeingefügt werdenauf dem Server seriell, in der angegebenen Reihenfolge. Wenn ein Fehler auftritt, werden alle verbleibenden Einsätze abgebrochen. Wenn False, Dokumente auf den Server in beliebiger Reihenfolge eingefügt werden, möglicherweise parallel und alle Dokument Inserts versucht werden.

Obwohl Sie immer noch eine Ausnahme behandeln müssen, wenn alle Dokumente nicht eingefügt werden konnten.

Je nach Anwendungsfall können Sie entweder pass auswählen, eine Warnung protokollieren oder die Ausnahme prüfen.

Verwandte Themen