2012-06-08 3 views
5

Ich habe eine Mongoengine.Document Unterklasse Benutzerdefiniert.Mongoengine Document als EmbeddedDocument

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

jetzt will ich es als eigenständiges Dokument mit der eigenen Sammlung verwenden, aber ich möchte es auch als EmbeddedDocument als Teil des Spiel Datensatz verwenden:

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

aber es ist ein Problem. Mongoengine ermöglicht nur das Einbetten von EmbeddedDocument-Unterklassen. Gibt es eine Möglichkeit, es zu lösen?

Antwort

2

wie diese versuchen:

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

Dies scheint nicht nach 0.10 Version – user541905

1

Sollte kein ReferenceField verwenden?

Andernfalls speichern Sie zwei getrennte, aber logisch identische Dokumente.

+1

Yeah ich weiß. Es ist geplantes Verhalten. – yakxxx

+0

Eine späte Auferstehung für eine einfache Frage, ich weiß, aber das ist die Antwort. +1. Speichern Sie Ihre Daten niemals an zwei verschiedenen Orten (es sei denn, der Bedarf ist enorm und Sie verstehen bereits alle Implikationen). Es ist wirklich einfach, ein Referenzfeld im Anwendungscode zu erweitern, und es ist fast so einfach, einen Randfall zu übersehen, die Aktualisierung der anderen Kopie Ihres Objekts zu vergessen und schließlich mit Inkonsistenzen zu enden. – dokkaebi

+1

@dokkaebi Ich stimme dir zu 100% zu. Ich habe gerade mit Legacy-Code/Datenbank gearbeitet und musste es über Mongoengine verbinden. Einige unserer Dienstleistungen wurden direkt in die Datenbank aufgenommen. Ich habe mit der Umgestaltung von Mongo mit RESTfull API begonnen, um das Schema an einer Stelle zu verwalten. Der nächste Schritt bestand darin, die DB-Struktur zu verbessern, wie Sie sagen, aber wir teilen den Prozess in einigen Schritten auf, um ihn besser testen/kontrollieren zu können. Und der erste Schritt war, alle abhängigen Dienste auf RESTfull-API umzustellen und dann das DB-Schema transparent zu ändern :) – yakxxx