2016-11-23 4 views
3

Ich habe eine MongoDB 3.2 Instanz unter Ubuntu 14.04 ausgeführt. Einzelner Knoten eingerichtet. Als ich die letzte Nacht eine Migration durchgeführt, wo ich diesen Code lief für ~ 1400 Dokumente in einer Sammlung:

for r in responses: # find cursor with ~1400 documents in it 
    database.responses.update_one({ 
     "_id" : r["_id"] 
    }, { 
     "$set" : { 
      "client_id" : client["_id"] 
     } 
    }) 

Nach der Migration einige der Felder in meinen Antwortdokumenten in der responses Sammlung waren von DateObject Typen Int32 Zeitstempel eingeschaltet Darstellungen. Einige der Int32 Felder wurden in Double s geändert. Diese Felder wurden in meiner $set-Anweisung (offensichtlich) nicht aktualisiert. Dies betrifft nur eine kleine Teilmenge des Cursors (~ 75 Dokumente).

Dies verursachte einen katastrophalen Fehler, da unsere Modelle erwarteten, dass diese Felder Datentypen hatten, die sie nicht mehr hatten. Kann mir jemand erklären, was hier schief gelaufen ist?

Antwort

0

nach Ihrer Frage zu lesen bekam ich neugierig zu wissen, was schief gelaufen ist, ich denke, wenn Sie explizit haben Ihre Art bei der Erstellung/Aktualisierung dieser Datensatz sitzen würden Sie nicht diese Frage gestellt haben, zum Beispiel: -

for r in responses: # find cursor with ~1400 documents in it 
database.responses.update_one({ 
    "_id" : r["_id"] 
}, { 
    "$set" : { 
     "client_id" : new DateObject(client["_id"]); 
    } 
}) 
+0

'client_id' ist bereits vom Typ ObjectId und war keines der betroffenen Felder, aber danke! –

0

Meine Vermutung ist, dass irgendwo anders in Ihrem Code Python Änderungen in den Typen vorgenommen hat (vielleicht einige Code, der versucht, den Typ automatisch abzuleiten !?).

Ich bin mir ziemlich sicher, dass es vor Ihrem Code "for r in responses:" noch etwas gibt, das vielleicht versucht, den Typ der Felder zu erkennen. Ist das der Fall? Können Sie den Code vor dem von Ihnen bereitgestellten Code bereitstellen?

+0

Es könnte Pymongo sein, die MongoDB-Bibliothek, die ich benutze, aber das ist noch nie zuvor geschehen ... Die Objekte in der 'Antworten'-Liste sind ein Cursor-Objekt mit Pymongo-Ergebnissen (BSON dicts) –

Verwandte Themen