2016-07-13 11 views
2

Ich versuche, die folgende Liste der Wörterbücher mit dem Namen posts zu Mongo einzufügen, und bekam einen BulkWriteError: batch op errors occurred Fehler, den ich nicht zu beheben weiß.Pymongo insert_many BulkWriteError

posts:

[{'#AUTHID': 'fffafe151f07a30a0ede2038a897b680', 
    'Records': [ 
    {'DATE': '07/22/09 05:54 PM', 
    'STATUS': 'Is flying back friday night in time to move the rest of his stuff then go to work the next morning... great.'}, 
    ...... 

    {'DATE': '07/19/09 04:39 PM', 'STATUS': 'is stealing his net by the lake'}]}, 

{'#AUTHID': 'fffafe151f07a30a0ede2038a897b680', 
    'Records': [ 
    {'DATE': '07/22/09 05:54 PM', 
    'STATUS': 'Is flying back friday night in time to move the rest of his stuff then go to work the next morning... great.'}, 
    {'DATE': '07/19/09 04:39 PM', 'STATUS': 'is stealing his net by the lake'}, 
    .... 

Der Code, den ich verwendet:

collection = db.posts 
collection.insert_many(p for p in posts) 

Aber dann bekam ich einen Fehler, der BulkWriteError: batch op errors occurred sagt und schaffte es nur das erste Wörterbuch zu importieren (entsprechend dem ersten #AUTHID)

Ich habe einen Link gefunden, der eine ähnliche Situation beschreibt, aber es erklärt nicht viel darüber, warum das passiert oder wie man es löst dieses Problem. Es ist unter der _Warum fügt PyMongo ein ID-Feld zu allen meinen Dokumenten hinzu? in dem folgenden Link:
https://github.com/mongodb/mongo-python-driver/blob/master/doc/faq.rst#id25

+0

Basierend auf Ihren Beispiel-Posts scheint das Dokument doppelt vorhanden zu sein, da der Inhalt derselbe ist. Bitte beachten Sie, dass die FAQ sagt, dass ** einzelnes Dokument ** als Vielfaches eingefügt werden soll. Ich vermute, dass dein 'dict (s)' dieselbe Instanz ist. – CallMeLaNN

Antwort

0

Here is output in dieser Ausgabe Aufzeichnungen sind Speicher, die in der Liste sind.

from pymongo import MongoClient 
client = MongoClient('localhost', 27017) 
db = client['post'] 
posts = [{'#AUTHID': 'fffafe151f07a30a0ede2038a897b680', 
    'Records': [ 
     {'DATE': '07/22/09 05:54 PM', 
      'STATUS': 'Is flying back friday night in time to move the rest of his stuff then go to work the next morning... great.'}, 


     {'DATE': '07/19/09 04:39 PM', 'STATUS': 'is stealing his net by the lake'}]}, 

    {'#AUTHID': 'fffafe151f07a30a0ede2038a897b680', 
     'Records': [ 
     {'DATE': '07/22/09 05:54 PM', 
     'STATUS': 'Is flying back friday night in time to move the rest of his stuff then go to work the next morning... great.'}, 
     {'DATE': '07/19/09 04:39 PM', 'STATUS': 'is stealing his net by the lake'}]}] 
collection = db.posti.insert_many(p for p in posts) 
1

Nicht zu spät, um hier zu antworten, Sie fast da. Ich bin nicht sicher, ob die FAQ aktualisiert, aber bitte richtig lesen:

wenn sie an ein einzigen Dokument insert_many() mit einer Liste von Referenzen Aufruf wirft BulkWriteError

Beachten Sie, dass es sagt einzelne oder mit anderen Worten, gleiche Instanz. Das Beispiel in den FAQ zeigt, wie der Fehler mit derselben Instanz erzeugt wird. Sie können prüfen, ob es gleich ist, indem Sie id() verwenden, um die Speicheradresse anzuzeigen. Tatsächlich kann ich sehen, dass der Inhalt Ihrer Dokumente derselbe ist. Höchstwahrscheinlich (aber nicht notwendigerweise) ist es dieselbe Instanz.

print id(posts[0]) 
print id(posts[1]) 

Wenn eine der dict die gleiche Instanz hat, dann ist etwas falsch während der Herstellung der posts variabel. Stellen Sie nur sicher, dass alle Listenelemente eine andere Instanz haben, weil Sie (viele) verschiedene Dokumente einfügen!