EmbeddedDocument
将允许将文档存储在另一个文档中,而RefereneField
只是存储它的引用。但是,他们正在实现类似的目标。他们有特定的用例吗?
PS: 在SO上已经有question,但没有好的答案。
答案 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中通过一些例子很好地解释了,我建议你看看它。