2013-04-04 2 views
6

Gibt es eine Möglichkeit, Pymongo einen benutzerdefinierten Encoder zu verwenden, um Python-Objekte in BSON zu konvertieren?Codierung benutzerdefinierte Python-Objekte als BSON mit Pymongo

Speziell muss ich numpy Arrays in BSON konvertieren. Ich weiß, ich kann manuell sicherstellen, dass jedes numpy Array in ein natives Python-Array konvertiert wird, bevor es an pymongo gesendet wird. Dies ist jedoch wiederholend und fehleranfällig. Ich hätte lieber eine Möglichkeit, meine Pymongo-Verbindung einzurichten, um dies automatisch zu tun.

Antwort

3

Sie müssen eine SONManipulator schreiben. Von der docs:

SONManipulator Instanzen können Sie angeben, dass Transformationen von PyMongo automatisch angewendet werden.

from pymongo.son_manipulator import SONManipulator 

class Transform(SONManipulator): 
    def transform_incoming(self, son, collection): 
    for (key, value) in son.items(): 
     if isinstance(value, Custom): 
     son[key] = encode_custom(value) 
     elif isinstance(value, dict): # Make sure we recurse into sub-docs 
     son[key] = self.transform_incoming(value, collection) 
    return son 
    def transform_outgoing(self, son, collection): 
    for (key, value) in son.items(): 
     if isinstance(value, dict): 
     if "_type" in value and value["_type"] == "custom": 
      son[key] = decode_custom(value) 
     else: # Again, make sure to recurse into sub-docs 
      son[key] = self.transform_outgoing(value, collection) 
    return son 

dann fügen Sie es Ihr pymongo Datenbankobjekt:

db.add_son_manipulator(Transform()) 

Hinweis: Sie müssen das _type Feld nicht hinzufügen, wenn Sie still ein numpy Array in einem Python-Array werfen wollen.

+0

'son_manipulator' ist zur Zeit veraltet. Sie werden auf v4.0 entfernt. Die offizielle Empfehlung ist, Dokumente zu transformieren, bevor sie an pymongo übergeben werden, wie in den [docs] (https://api.mongodb.com/python/current/api/pymongo/son_manipulator.html) angegeben. –