2013-08-25 2 views
7

Ich habe mongo seit einer Weile wissen (mit Python, Mongo 2.4.4 64 Bit, OS X 10.8.2, Pymongo 2.5.2, Python 2.7.2), und ich beobachtete ein seltsames Verhalten. Manchmal wirft es folgende Ausnahme, wenn ein Dokument in eine Sammlung einfügen versuchen:InvalidDocument: Objekt kann nicht codiert werden: ObjectId ('51861bc79bb6550f2b98be23')

Objekt kann nicht kodieren: ObjectId ('51861bc79bb6550f2b98be23')

... „/ Users/nutrina/www/env_pdf_admin_apache/lib /python2.7/site-packages/pymongo/collection.py ", Zeile 266, in Speichern zurück self.insert (to_save, manipulieren, sicher, check_keys, ** kwargs) Datei "/Benutzer/nutrina/www/env_pdf_admin_apache/lib/python2.7/site-packages/pymongo/collection.py ", Zeile 357, im Einfügen continue_on_error, self .__ uuid_subtype), safe) InvalidD OKUMENT: Kann Objekt kodieren: ObjectId ('51861bc79bb6550f2b98be23')

Ich habe keine Ahnung, warum dies geschieht. Ist jemand auf diesen Fehler gestoßen oder hat jemand eine Idee, was ihn verursachen könnte?

Update: Das Objekt, das ich zu retten versuchen hat folgende Struktur:

{ 
    'is_open': true, // boolean 
    'data': { 
     'user_id': ObjectId(...), // ObjectId 
     'user_type': 1,   // Integer 
    } 
} 

Der Fehler wird für das Feld gemeldet * User_id *, aber ich bin ziemlich sicher, dass dieser Wert eine gültige ObjectId ist. Dies ist die '_id' eines Objekts (Benutzers) aus einer anderen Sammlung (Benutzer). Und die Sicherungsoperation ist meistens für den gleichen Wert erfolgreich.

Danke, Gerald

+0

Gibt es noch etwas über das Objekt, das Sie speichern möchten, das Sie teilen könnten? Welche Art von Daten enthält es? – WiredPrairie

+0

siehe hier http://stackoverflow.com/a/18414699/535962 – lovesh

+0

Ich habe die Beschreibung des Problems aktualisieren. @lovesh: Ich glaube nicht, dass dieses Problem zusammenhängt. – nutrina

Antwort

1

Wenn Sie nicht einen nativen Typ in Ihrem Dokument (string, integer, Datum, boolean usw.) verwenden, müssen Sie es verschlüsselt richtig sicher machen. Wenn Sie Ihre nicht standardmäßigen Datentypen nicht richtig codieren, gibt es keine Garantie, dass sie in PyMongo eingefügt werden können. Sie treffen wahrscheinlich einen Randfall, bei dem Sie Ihr neues Objekt nicht in ein PyMongo-Dokument einbauen wollen.

PyMongo: Custom Types

+0

Nun, ich denke, 'ObjectId' ist ein nativer Typ, der sowohl von Pymongo als auch von Mongodb selbst unterstützt wird.Also sollte es noch etwas anderes geben, das für OP –

+0

schief geht. Ja, es ist ein Standardtyp, für den die Ausnahme ausgelöst wird, es ist eine gültige ObjectId, und ich bin ziemlich sicher, dass der Wert, den ich gesetzt habe, gültig ist. Bitte beachten Sie mein Update zur Problembeschreibung. – nutrina

10

Python ganze Zahlen werden als Zahlen beliebiger Genauigkeit gespeichert, die von MongoDB nicht unterstützt wird. Sie müssen sie zuerst in normale Int64- oder String-Objekte konvertieren.

Verwandte Themen