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_inheritanceFalsemongoengine 将不会保存该文档_cls_types字段。

于 2012-12-14T10:31:21.303 回答