2012-06-08 17 views
5

Tengo una subclase mongoengine.Document Definido por el usuario.Mongoengine Documento como EmbeddedDocument

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

ahora quiero utilizarlo como documento independiente con su propia colección, pero quiero también para utilizarlo como EmbeddedDocument como parte del registro del juego:

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

pero hay un problema. Mongoengine permite incrustar solo subclases EmbeddedDocument. ¿Hay alguna manera de resolverlo?

Respuesta

2

Trate de esta manera:

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

Esto no parece funcionar después de 0,10 versión – user541905

1

No deberías estar usando un ReferenceField?

De lo contrario, está almacenando dos documentos desconectados, pero lógicamente idénticos.

+1

Sí, lo sé. Es un comportamiento planificado. – yakxxx

+0

Una resurrección tardía para una pregunta simple, lo sé, pero esta es la respuesta. +1. Nunca almacene sus datos en dos lugares separados (a menos que la necesidad sea tremenda y ya comprenda todas las implicaciones). Es realmente fácil expandir un campo de referencia en el código de la aplicación, y es casi tan fácil pasar por alto algunos casos extremos, olvidarse de actualizar la otra copia de su objeto y terminar con inconsistencias. – dokkaebi

+1

@dokkaebi Estoy de acuerdo contigo 100%. Solo estaba trabajando con algún código/base de datos heredado y tuve que conectarlo a través de mongoengine. Algunos de nuestros servicios estaban llegando directamente a la base de datos. Comencé una importante refactorización con la interfaz de Mongo con la API RESTfull para administrar el esquema en un solo lugar. El siguiente paso fue mejorar la estructura de la base de datos como usted dice, pero dividimos el proceso en algunos pasos para tener mejores pruebas/control sobre él. Y el primer paso fue cambiar cada servicio dependiente para usar RESTfull API, y luego cambiar el esquema de DB de forma transparente :) – yakxxx

Cuestiones relacionadas