gpt4 book ai didi

python - mongoengine.DynamicEmbeddedDocument 与 mongoengine.DictField 有什么区别?

转载 作者:行者123 更新时间:2023-12-04 14:12:31 24 4
gpt4 key购买 nike

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

一个 mongoengine.DictField同样允许使用 MongoDB 的无模式特性。在文档中,他们只是说(w.r.t. DictField)

This is similar to an embedded document, but the structure is not defined.



那么,这是否意味着 mongoengine.fields.DictFieldmongoengine.DynamicEmbeddedDocument完全可以互换吗?

编辑(更多信息):
mongoengine.DynamicEmbeddedDocument继承自 mongoengine.EmbeddedDocument其中,从代码是:

A mongoengine.Document that isn't stored in its own collection. mongoengine.EmbeddedDocuments should be used as fields on mongoengine.Documents through the mongoengine.EmbeddedDocumentField field type.



一个 mongoengine.fields.EmbeddedDocumentField

An embedded document field - with a declared document_type. Only valid values are subclasses of EmbeddedDocument.



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

最佳答案

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

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 = {} 后尝试保存会引发异常)。此外,如果您不想将该字段绑定(bind)到特定类型的 EmbeddedDocument,则可以使用 GenericEmbeddedDocumentField,但该字段仍需要指向从 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。

关于python - mongoengine.DynamicEmbeddedDocument 与 mongoengine.DictField 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25938369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com