【问题标题】:MongoEngine: EmbeddedDocument v/s. ReferenceFieldMongoEngine:EmbeddedDocument v/s。参考字段
【发布时间】:2016-04-26 03:39:54
【问题描述】:

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

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

【问题讨论】:

  • 如果你想在你的项目中使用RefereceField,你可能应该考虑使用Django ORM和connecting it to MongoDB而不是使用MongoEngine。

标签: python mongodb mongoengine


【解决方案1】:

这个问题的答案实际上取决于您打算如何处理您存储在 mongodb 中的数据。请务必记住,ReferenceField 将指向 mongodb 中另一个集合中的文档,而 EmbeddedDocument 存储在同一集合中的同一文档中。

考虑这个架构:

Person
    -> name
    -> address

Address
    -> street
    -> city
    -> country

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

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

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

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

要考虑的另一点是,除非您在检索文档时 turn it off mongoengine 将取消引用每个 ReferenceField - 这可能会导致性能损失,因为大量 ReferenceField 或引用非常大的文档。

【讨论】:

    【解决方案2】:

    这实际上是关于 MongoDB 中集合的架构设计。通常它取决于不同的因素,例如关系的基数、访问数据的方式或文档的大小。官方MongoDB's blog中已经解释的很好,举了一些例子,推荐大家看看。

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 2015-09-13
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      相关资源
      最近更新 更多