2014-11-18 25 views
8

Sto modellando un database MongoBD in MongoEngine per un progetto Web. Voglio memorizzare i dati in un modo un po 'insolito per poterli interrogare in modo efficiente in seguito.MongoEngine: archiviazione di EmbeddedDocument in DictField

I nostri dati in MongoDB simile a questa:

// "outer" 
{ 
    "outer_data": "directors", 
    "embed": { 
    "some_md5_key": { "name": "P.T. Anderson" }, 
    "another_md5_key": { "name": "T. Malick" }, 
    ... 
    } 
} 

Il mio primo istinto è stato quello di modellare in questo modo in MongoEngine:

class Inner(EmbeddedDocument): 
    name = StringField() 

class Outer(Document): 
    outer_data = StringField() 
    embed = DictField(EmbeddedDocument(Inner)) # this isn't allowed but you get the point 

In altre parole, quello che in sostanza voglio è la stessa una memorizzazione di EmbeddedDocument in un ListField ma piuttosto in un DictField con chiavi dinamiche per ogni EmbeddedDocument.

Esempio che è consentito con un ListField per riferimento:

class Inner(EmbeddedDocument): 
    inner_id = StringField(unique=True) # this replaces the dict keys 
    name = StringField() 

class Outer(Document): 
    outer_data = StringField() 
    embed = ListField(EmbeddedDocument(Inner)) 

io preferirei avere oggetti MongoEngine restituiti anche nidificati documenti "interiore", pur utilizzando un DictField + EmbeddedDocument (come dict " valore"). Come posso modellare questo in MongoEngine? È persino possibile o devo ingannare tutti i dati in un DictField generico?

risposta

14

Ho finalmente trovato la risposta al mio problema. Il modo corretto per ottenere questo modello è facendo uso di un MapField.

Il modello corrispondente MongoEngine assomiglia:

class Inner(EmbeddedDocument): 
    name = StringField() 

class Outer(Document): 
    outer_data = StringField() 
    embed = MapField(EmbeddedDocumentField(Inner)) 

In MongoDB, tutte le chiavi deve essere stringhe quindi non c'è bisogno di specificare un "tipo di campo" per le chiavi nella MapField.

+2

Ho provato questo approccio ma durante il salvataggio mi dà "L'oggetto SON di origine deve essere di tipo 'dict'". Hai una soluzione per questo sarà molto utile. Grazie – ptwo