mongoengine使用引用字段对嵌入式文档进行慢速序列化

时间:2016-08-22 20:50:25

标签: pymongo mongoengine flask-mongoengine

我有一个包含大约500条记录的小型数据库。我正在尝试实现一个版本控制方案,我将表单及其当前版本保存到我的Record集合中。理想情况下,我希望将表单及其版本号存储在嵌入式文档中,以保证整洁:

class Structure(db.EmbeddedDocument):
    form = db.ReferenceField(Form, required = True)
    version = db.IntField(required = True)

    @property
    def short(self):
        return {
             'form': self.form,
             'version': self.version
        }

class Record(db.Document):
    structure = db.EmbeddedDocumentField(Structure)

    @property
    def short(self):    
        return {
            'structure': self.structure.short
        }

这样当我回忆起一条记录时,我可以抓住当时使用的表格和版本。运行一些时间测试:

start = time.clock()
records = Record.objects.select_related()
print ('Time: ', time.clock() - start)  
response = [i.short for i in records]
print ('Time: ', time.clock() - start)

我发现所有记录Record.objects.select_related()的查询时间合理,大约1.12秒,但是,我发现为了JSON传输而进行序列化在~24.1s时非常昂贵!

如果我通过删除使用EmbeddedDocument进行了一些修改:

class Record(db.Document):
    form = db.ReferenceField(Form, required = True)
    version = db.IntField(required = True)

    @property
    def short(self):    
        return {
            'form': self.form,
            'version': self.version
        }

运行相同的测试我发现查询时间在~1.36 s时几乎没有变化,但序列化时间提高了24x到1.14s。我真的不明白为什么使用嵌入式文档会导致序列化时间的大量惩罚......?在嵌入对象中解除引用更难吗?

0 个答案:

没有答案