2012-06-08 15 views
5

Possiedo una sottoclasse mongoengine.Document Definito dall'utente.Mongoengine Document as EmbeddedDocument

class User(Document): 
    meta = {'collection': 'users', 'allow_inheritance': False} 
    _id = ObjectIdField() 
    password = StringField(max_length=50) 
    name = StringField(max_length=50, required 

ora voglio usarlo come documento autonomo con una propria collezione, ma voglio anche di usarlo come EmbeddedDocument come parte del record di gioco:

class Game(Document): 
    meta = {'collection': 'games', 'allow_inheritance': False} 
    _id = ObjectIdField() 
    name = StringField() 
    owner = EmbeddedField(User) 

ma c'è un problema. Mongoengine consente di incorporare solo sottoclassi di EmbeddedDocument. C'è un modo per risolverlo?

risposta

2

Prova in questo modo:

class User(Document, EmbeddedDocument): 
    ... 
+1

Questo non sembra funzionare dopo la versione 0.10 – user541905

1

Non dovrebbe essere usando un ReferenceField?

Altrimenti, si stanno memorizzando due documenti scollegati, ma logicamente identici.

+1

Sì, lo so. È un comportamento pianificato. – yakxxx

+0

Una risurrezione tardiva per una semplice domanda, lo so, ma questa è la risposta. +1. Non archiviare mai i tuoi dati in due luoghi separati (a meno che il bisogno sia tremendo e comprendi già tutte le implicazioni). È davvero facile espandere un campo di riferimento nel codice dell'applicazione, ed è quasi altrettanto facile perdere un caso limite, dimenticare di aggiornare l'altra copia dell'oggetto e finire con incoerenze. – dokkaebi

+1

@dokkaebi Sono d'accordo con te al 100%. Stavo solo lavorando con qualche codice/database legacy e ho dovuto interfacciarlo via mongoengine. Alcuni dei nostri servizi sono andati direttamente al database. Ho iniziato un importante refactoring con l'interfacciamento di Mongo con RESTfull API per gestire lo schema in un unico punto. Il passo successivo era migliorare la struttura del DB come dici tu, ma abbiamo diviso il processo in alcuni passaggi per migliorarne il controllo/controllo. Il primo passo è stato passare a ogni servizio dipendente per utilizzare l'API RESTfull e quindi modificare lo schema DB in modo trasparente :) – yakxxx

Problemi correlati