为什么 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
字段。