7

mongoengine がコレクションのすべてのドキュメントに_typesフィールドと_clsフィールドを追加するのはなぜですか。 どちらも (キー、値) のペアであり、ドキュメントのモデル クラスの名前が含まれています。唯一の違いは_types値がリストであり、継承が関係している場合は複数のモデル クラス名を持つことができると想定しています。

ただし、問題は、すべてのドキュメントが両方のフィールドに同じ値を持つのに、コレクション内のすべてのドキュメントに存在する必要があるのはなぜですか?

4

1 に答える 1

12

Mongoengine ではドキュメントの継承が可能です。クラスを定義するとき、メタ属性allow_inheritanceを使用して、この特定のクラスをサブクラス化できます。およびフィールドは_cls_typesオブジェクトが属するクラスを識別するために使用されます。

Userユーザーの情報を保存するために使用されるドキュメントを考えてみましょう:

class User(Document):
    meta = {'allow_inheritance': True}
    # stores information regarding a user

というドキュメントを考えてみましょうStackOverFlowUser。このドキュメントはUserドキュメントから継承され、ユーザーの StackOverflow 関連の情報を保存します。

class StackOverFlowUser(User):
    # stores StackOverflow information of a user

これら両方のドキュメント クラスに対して、mongoengine は という名前の同じコレクションを使用しますuser。どのドキュメント オブジェクトを作成しても、このコレクションにドキュメントとして保存されます。

オブジェクトが属するクラスを区別するため、_clsおよび_typesフィールドが使用されます。

オブジェクトのUser場合:

{
    ...
    '_cls' = 'User',
    '_types' = ['User', 'User.StackOverFlowUser']
}

オブジェクトのStackOverFlowUser場合:

{
    ...
    '_cls' = 'User.StackOverFlowUser',
    '_types' = ['User', 'User.StackOverFlowUser']
}

ドキュメントにサブクラスのドキュメントがないことが確実な場合は、に設定allow_inheritanceするFalseと、mongoengine はそのドキュメントのフィールドを保存_clsしません。_types

于 2012-12-14T10:31:21.303 に答える