MongoEngine:EmbeddedDocument v / s。 ReferenceField

时间:2016-01-20 10:32:47

标签: python mongodb mongoengine

EmbeddedDocument将允许将文档存储在另一个文档中,而RefereneField只是存储它的引用。但是,他们正在实现类似的目标。他们有特定的用例吗?

PS: 在SO上已经有question,但没有好的答案。

2 个答案:

答案 0 :(得分:5)

这个问题的答案实际上取决于你想要在mongodb中存储的数据。重要的是要记住,ReferenceField将指向mongodb中另一个集合中的文档,而EmbeddedDocument则存储在同一集合中的同一文档中。

考虑这个架构:

Person
    -> name
    -> address

Address
    -> street
    -> city
    -> country

如果您希望每个人只有一个地址,并且每个地址只与一个人(一对一的关系)相关联,那么您通常会在数据库中查询一个或多个Person然后Person.address字段应为EmbeddedDocumentField

如果您希望每个人都有多个地址,但每个地址只与一个人(一对多关系)相关联,并且您仍然主要查询一个人,那么您可以使用{{1 }}

如果您希望每个人都有多个地址,并且每个地址都会与很多人(多对多关系)相关联,那么您可能应该使用EmbeddedDocumentListField

但是,即使您是一对一或一对多,如果ReferenceField是您感兴趣的数据模型的一部分,那么将它存储在其中可能是有利的&# 39;自己的集合,因为它使聚合和索引更容易。

要考虑的另一点是,除非{/ 3}} mongoengine在检索文档时将取消引用每个Address,否则可能会引入大量ReferenceField的性能损失或引用非常大的文件。

答案 1 :(得分:1)

它真的是关于MongoDB中集合的架构设计。一般来说,它取决于不同的因素,如关系的基数,访问数据的方式或文档的大小。它在官方MongoDB's blog中通过一些例子很好地解释了,我建议你看看它。