首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongoengine.DynamicEmbeddedDocument和mongoengine.DictField的区别是什么?

mongoengine.DynamicEmbeddedDocument和mongoengine.DictField的区别是什么?
EN

Stack Overflow用户
提问于 2014-09-19 16:22:46
回答 1查看 2.3K关注 0票数 7

mongoengine.DynamicEmbeddedDocument可以用来利用MongoDB的灵活的无模式设计。它是可扩展的,不对字段afaik应用类型约束。

类似地,mongoengine.DictField允许使用MongoDB的模式--无模式的特性。在文档中,他们只是简单地说(w.r.t )。( DictField)

这类似于嵌入式文档,但结构没有定义。

这是否意味着,mongoengine.fields.DictFieldmongoengine.DynamicEmbeddedDocument是完全可互换的?

编辑(获得更多信息):

mongoengine.DynamicEmbeddedDocument是从mongoengine.EmbeddedDocument继承的,mongoengine.EmbeddedDocument的代码是:

一个没有存储在自己的集合中的mongoengine.Documentmongoengine.EmbeddedDocuments应该通过mongoengine.Documents字段类型作为mongoengine.Documents上的字段。

mongoengine.fields.EmbeddedDocumentField

带有声明的document_type的嵌入式文档字段。只有有效值是EmbeddedDocument的子类。

这是否意味着DictFieldDynamicEmbeddedDocument不能完全互换的唯一原因是必须通过EmbeddedDocumentField字段类型定义DynamicEmbeddedDocument

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-19 18:59:34

据我所见,这两者是相似的,但并不完全可以互换。根据您的需要,每种方法都可能有一点优势。首先,正如您所指出的,这两种方法在文档中需要不同的定义,如下所示。

代码语言:javascript
复制
class ExampleDynamicEmbeddedDoc(DynamicEmbeddedDocument):
    pass

class ExampleDoc(Document):
    dict_approach = DictField()
    dynamic_doc_approach = EmbeddedDocumentField(ExampleDynamicEmbeddedDoc, default = ExampleDynamicEmbeddedDoc())

注意:缺省值不是必需的,但是为了保存,需要将dynamic_doc_approach字段设置为ExampleDynamicEmbeddedDoc对象。(即在设置example_doc_instance.dynamic_doc_approach = {}后尝试保存将引发异常)。此外,如果不希望将字段绑定到特定类型的GenericEmbeddedDocumentField,则可以使用EmbeddedDocument,但为了保存,该字段仍然需要指向从EmbeddedDocument中子类的对象。

一旦设置完毕,这两者在功能上是相似的,因为您可以根据需要不受限制地将数据保存到它们:

代码语言:javascript
复制
e = ExampleDoc()
e.dict_approach["test"] = 10
e.dynamic_doc_approach.test = 10

但是,我看到的一个主要区别是,可以对添加到DictField的任何值进行查询,而不能使用DynamicEmbeddedDoc查询。

代码语言:javascript
复制
ExampleDoc.objects(dict_approach__test = 10) # Returns a QuerySet containing our entry.
ExampleDoc.objects(dynamic_doc_approach__test = 10) # Throws an exception.

尽管如此,使用EmbeddedDocument具有验证文档中将显示的字段的优点。(我们只需将它们添加到ExampleDynamicEmbeddedDoc定义中即可)。因此,我认为,当您对字段的模式有了很好的了解,并且只期望最少地添加字段(您不需要对其进行查询)时,最好使用DynamicEmbeddedDocument。但是,如果您不关心验证或预期添加大量您将查询的字段,请使用DictField。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25938369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档