2012-06-08 16 views
5

私はmongoengine.Documentサブクラスを定義しています。埋め込みドキュメントとしてのMongoengineドキュメント

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

は、今私は、独自のコレクションをスタンドアロン文書としてそれを使用したいが、私はまた、ゲームの記録の一部としてEmbeddedDocumentとしてそれを使用したい:

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

が、問題があります。 Mongoengineでは、EmbeddedDocumentサブクラスのみを埋め込むことができます。それを解決する方法はありますか?

答えて

2

は次のように試してみてください:

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

これは0.10以降では動作しないようです – user541905

1

あなたはReferenceFieldを使用することではないでしょうか?

それ以外の場合は、2つの接続は解除されていますが、論理的に同一のドキュメントを保存しています。

+1

ええ、私は知っています。それは計画された行動です。 – yakxxx

+0

簡単な質問のための遅い復活、私は知っているが、これは答えである。 +1。データが2つの別々の場所に保存されることはありません(必要性が非常に高く、すべての意味をすでに理解している場合を除きます)。アプリケーションコードで参照フィールドを拡張するのは本当に簡単ですが、いくつかのエッジケースを見落としたり、オブジェクトの別のコピーを更新したり、矛盾したりすることは忘れてしまいます。 – dokkaebi

+1

@dokkaebi私はあなたと100%同意します。私はいくつかのレガシーコード/データベースを使って作業していて、mongoengine経由でそれをインターフェースしなければなりませんでした。一部のサービスはデータベースに直接接続していました。私はMongoとRESTfull APIとのインタフェースを使用して主要なリファクタリングを開始し、スキーマを1か所で管理しました。次のステップはDB構造を改善することでしたが、いくつかのステップでプロセスを分割して、より優れたテスト/制御ができるようにしました。最初のステップは、RESTfull APIを使用するようにすべての依存サービスを切り替えてから、DBスキーマを透過的に変更することでした。 – yakxxx

関連する問題