mongoengine.DynamicEmbeddedDocument可以用来利用MongoDB的灵活的无模式设计。它是可扩展的,不对字段afaik应用类型约束。
类似地,mongoengine.DictField允许使用MongoDB的模式--无模式的特性。在文档中,他们只是简单地说(w.r.t )。( DictField)
这类似于嵌入式文档,但结构没有定义。
这是否意味着,mongoengine.fields.DictField和mongoengine.DynamicEmbeddedDocument是完全可互换的?
编辑(获得更多信息):
mongoengine.DynamicEmbeddedDocument是从mongoengine.EmbeddedDocument继承的,mongoengine.EmbeddedDocument的代码是:
一个没有存储在自己的集合中的
mongoengine.Document。mongoengine.EmbeddedDocuments应该通过mongoengine.Documents字段类型作为mongoengine.Documents上的字段。
mongoengine.fields.EmbeddedDocumentField是
带有声明的document_type的嵌入式文档字段。只有有效值是
EmbeddedDocument的子类。
这是否意味着DictField和DynamicEmbeddedDocument不能完全互换的唯一原因是必须通过EmbeddedDocumentField字段类型定义DynamicEmbeddedDocument?
发布于 2014-09-19 18:59:34
据我所见,这两者是相似的,但并不完全可以互换。根据您的需要,每种方法都可能有一点优势。首先,正如您所指出的,这两种方法在文档中需要不同的定义,如下所示。
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中子类的对象。
一旦设置完毕,这两者在功能上是相似的,因为您可以根据需要不受限制地将数据保存到它们:
e = ExampleDoc()
e.dict_approach["test"] = 10
e.dynamic_doc_approach.test = 10但是,我看到的一个主要区别是,可以对添加到DictField的任何值进行查询,而不能使用DynamicEmbeddedDoc查询。
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。
https://stackoverflow.com/questions/25938369
复制相似问题