MongoDB 是不是使用相同的数据重复子文档?

Posted

技术标签:

【中文标题】MongoDB 是不是使用相同的数据重复子文档?【英文标题】:Does MongoDB duplicate subdocument with identical data?MongoDB 是否使用相同的数据重复子文档? 【发布时间】:2014-01-25 09:06:39 【问题描述】:

我对 MongoDB 完全陌生,正在考虑使用 JDO 作为不可知层将我的基本持久性代码(对于许多项目)转移到它。所以我是从一个喜欢以bean为基本模型单元的java开发者的角度来问这个问题的。

我的问题是关于子文档以及它们是独立存在还是由 MongoDB 在内部合并。即,如果我有这样的域结构:

家庭 - 人员集合

Person
 - name
 - address

Address
 - street
 - postcode

如果我有一个家庭的文件,它将有多个人,但每个人都有相同的地址。

每个地址在 MongoDB 中是否是一个不同且独立的实体(即使它们是相同的“类”并且具有相同的值。或者 Mongo 是否以某种方式识别它们指的是同一个实体并在内部为每个地址存储一个 UID地址?

更重要的是。如果我更新一个地址的邮政编码,这是否意味着家庭地址子文档的每个成员都会反映该更改?

如果确实如此,那么它似乎会误入关系领域,但如果没有这样的引用,我会看到出现可怕的低效率吗?

【问题讨论】:

【参考方案1】:

Mongo 不会为您删除这些子文档的重复数据,不会。如果要规范化该数据,则需要将这些地址保存到不同的集合中(理想情况下),并在保存封闭文档时将 DBRefs 存储到这些文档中。使用 morphia 或 spring-data 之类的东西可以帮助您管理这些引用。

【讨论】:

【参考方案2】:

如果通过 JDO 持久化数据,您可以选择将 Person+Address 嵌入到 Household 中,或者作为单个对象持久化(就像使用 RDBMS 一样)。如果存储为非嵌入式,则取决于您是否拥有同一个人的多个副本,或者多个家庭引用的单个副本。如果存储为嵌入式,则它们是嵌入式的,因此是家庭的一部分,因此信息是重复的。

【讨论】:

以上是关于MongoDB 是不是使用相同的数据重复子文档?的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb检查数组的子文档中是否存在字段

如何在mongodb中高效分页[重复]

避免使用mongodb重复文档而不使用唯一索引

对多级子文档使用位置运算符[重复]

mongodb在子文档数组的数组中获取不同的项目

如何使用 C# 驱动程序更新 MongoDB 数组中的子文档