2012-06-08 20 views
5

Mam mongoengine.Document podklas User defined.Dokument Mongoengine jako EmbeddedDocument

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

teraz chcę go używać jako samodzielny dokument z własnej kolekcji, ale chcę również, aby używać go jako EmbeddedDocument jako część rekordu gry:

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

ale nie jest to problem. Mongoengine pozwala osadzać tylko podklasy EmbeddedDocument. Czy istnieje sposób, aby go rozwiązać?

Odpowiedz

2

Spróbuj tak:

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

To nie wydaje się działać po wersji 0.10 – user541905

1

nie powinien być używany do ReferenceField?

W przeciwnym razie przechowujesz dwa rozłączone, ale logicznie identyczne dokumenty.

+1

Tak, wiem. To zaplanowane zachowanie. – yakxxx

+0

Późne zmartwychwstanie na proste pytanie, wiem, ale to jest odpowiedź. +1. Nigdy nie przechowuj swoich danych w dwóch oddzielnych miejscach (chyba że potrzeba jest ogromna i już znasz wszystkie implikacje). Łatwo jest rozwinąć pole referencyjne w kodzie aplikacji, a prawie tak łatwo jest pominąć przypadek krawędzi, zapomnieć o aktualizacji drugiej kopii obiektu, a skończy się niespójnościami. – dokkaebi

+1

@dokkaebi Zgadzam się z Tobą w 100%. Właśnie pracowałem z jakimś starszym kodem/bazą danych i musiałem połączyć go poprzez mongoengine. Niektóre z naszych usług trafiały bezpośrednio do bazy danych. Rozpocząłem duży proces refaktoryzacji, łącząc Mongo z RESTfull API, aby zarządzać schematem w jednym miejscu. Następnym krokiem było poprawienie struktury DB, jak mówisz, ale podzieliliśmy proces w kilku krokach, aby uzyskać lepsze testowanie/kontrolę nad nim. Pierwszym krokiem było przełączenie każdej zależnej usługi na używanie RESTfull API, a następnie zmiana schematu bazy danych w przejrzysty sposób :) – yakxxx

Powiązane problemy