【问题标题】:How to store a subclass that is not a direct subclass of "Document" in its own collection?如何在自己的集合中存储不是“文档”的直接子类的子类?
【发布时间】:2016-02-29 05:24:43
【问题描述】:

根据 Document Inheritence 上的 MongoEngine 文档

我尝试创建一个基类如下

import datetime
from mongoengine import *
connect("testdb")
class Base(Document):
   companyId = StringField(required=True)
   creationDate = DateTimeField()
   modifiedDate = DateTimeField()

   meta = {'allow_inheritance': True}

   def save(self, *args, **kwargs):
       if not self.creationDate:
           self.creationDate = datetime.datetime.now()
       self.modifiedDate = datetime.datetime.now()
       return super(Base, self).save(*args, **kwargs)

 class Child1(Base):
   #     identifier = StringField(required=True, unique=True, primary_key=True)
    createdBy = StringField(required=True)

 class Child2(Base):    
     memberId = StringField(required=True)

 Child1(companyId='ab', createdBy='123').save()
 Child2(companyId='ab', memberId='123').save()

我的目标是在“testdb”下获得两个名为 Child1 和 Child2 的集合,但只创建一个名为“base”的集合,其中包含两个文档。

{
"_id" : ObjectId("5656b66381f49543f27af85a"),
"_cls" : "Base.Child1",
"companyId" : "ab",
"creationDate" : ISODate("2015-11-26T13:06:01.689Z"),
"modifiedDate" : ISODate("2015-11-26T13:06:01.689Z"),
"createdBy" : "123"
}

/* 1 */
{
"_id" : ObjectId("5656b66381f49543f27af85b"),
"_cls" : "Base.Child2",
"companyId" : "ab",
"creationDate" : ISODate("2015-11-26T13:06:03.621Z"),
"modifiedDate" : ISODate("2015-11-26T13:06:03.621Z"),
"memberId" : "123"
}

如何为我的子类指定不同的集合名称?

版本

python 2.7.10

mongodb 3.0.3

mongoengine 0.8.7

pymongo 2.7.2

【问题讨论】:

    标签: python pymongo mongoengine


    【解决方案1】:

    根据您链接的documentation,这是预期的行为。

    要创建您定义的文档的特殊类型,您可以对其进行子类化并添加您可能需要的任何额外字段或方法。由于这是新类不是 Document 的直接子类,因此不会存储在自己的集合中;它将使用与其超类相同的集合。

    据说要存储在它自己的集合中,你需要基类必须是一个抽象类,你可以选择使用它们的元属性指定子类集合的名称。

    class Base(Document):
       ...
       meta = {
           'allow_inheritance': True,
           'abstract': True
       }
       ...
    
    class Child1(Base):    
        ...
        meta = {'collection': 'child1'} # optional
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 2013-01-19
      相关资源
      最近更新 更多