爲什麼mongoengine將_types和_cls字段添加到集合的每個文檔。
它們都是(鍵,值)對,它們都包含文檔模型類的名稱。唯一的區別是_types值是一個列表,我假設它可以有多個模型類名稱,如果涉及一些繼承。MongoEngine _types和_cls字段
但問題是:爲什麼我需要它們存在於集合中的每個文檔中,當所有文檔的兩個字段都具有相同的值時?
爲什麼mongoengine將_types和_cls字段添加到集合的每個文檔。
它們都是(鍵,值)對,它們都包含文檔模型類的名稱。唯一的區別是_types值是一個列表,我假設它可以有多個模型類名稱,如果涉及一些繼承。MongoEngine _types和_cls字段
但問題是:爲什麼我需要它們存在於集合中的每個文檔中,當所有文檔的兩個字段都具有相同的值時?
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
字段。
請注意,_types將在0.8 – Ross