mongoengine がコレクションのすべてのドキュメントに_typesフィールドと_clsフィールドを追加するのはなぜですか。
どちらも (キー、値) のペアであり、ドキュメントのモデル クラスの名前が含まれています。唯一の違いは_types値がリストであり、継承が関係している場合は複数のモデル クラス名を持つことができると想定しています。
ただし、問題は、すべてのドキュメントが両方のフィールドに同じ値を持つのに、コレクション内のすべてのドキュメントに存在する必要があるのはなぜですか?
mongoengine がコレクションのすべてのドキュメントに_typesフィールドと_clsフィールドを追加するのはなぜですか。
どちらも (キー、値) のペアであり、ドキュメントのモデル クラスの名前が含まれています。唯一の違いは_types値がリストであり、継承が関係している場合は複数のモデル クラス名を持つことができると想定しています。
ただし、問題は、すべてのドキュメントが両方のフィールドに同じ値を持つのに、コレクション内のすべてのドキュメントに存在する必要があるのはなぜですか?
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