减少大型文档的大小
Overview
在数据库中存储大型文档会导致占用过多 RAM 和带宽。MongoDB 将经常访问的数据(称为工作集)保存在 RAM 中。当工作集增长超过 RAM 分配量时,性能就会下降,因为必须从磁盘检索数据。
如果您最常查询的是包含比该查询所需信息多得多的文档,请考虑使用对其他集合的引用,使用较小的文档重构模式。 通过将数据分解为更多集合并对经常访问的数据使用较小的文档,可以减少工作集的总体大小并提高性能。
注意
硬件配置可能会影响系统可支持的文档大小。 BSON 文档大小限制为16 MB。
例子
考虑电影目录网站, 在主页上显示最近上映的 50 部电影及其海报图片。 用户可以单击主页上的电影查看更多细节。
网站将电影信息存储在 movies
集合中。每个电影文档都包含该电影的所有可用信息:
// movies collection { "_id": 123, "title": "2001: A Space Odyssey", "poster": <url>, "director": "Stanley Kubrick", "release_year": 1968, "box_office_usd": 146000000, "countries_released": [ "United States", ... ], "cast": [ "Keir Dullea", ... ], "crew": [ "Ray Lovejoy", ... ], ... }
注意
只要有可能,您就应该在 MongoDB 部署之外托管图像, 然后用 URL 加以引用。如果将图像 存储在数据库中,则更有可能达到文档大小限制。
本示例中,网站最常执行的查询是查找 50 部最新电影的 title
和 poster
。与其查询所有电影信息,不如考虑将 movie
集合拆分成 movies
和 movie_metadata
两个单独的集合。这些集合与 movie
文档的 _id
相关联:
// movies collection { "_id": 123, "title": "2001: A Space Odyssey", "poster": <url> }
// movie_metadata collection { "_id": <object_id>, "movie_id": 123, // reference to a movies document "director": "Stanley Kubrick", "release_year": 1968, "box_office_usd": 146000000, "countries_released": [ "United States", ... ], "cast": [ "Keir Dullea", ... ], "crew": [ "Ray Lovejoy", ... ], ... }
这样,当网站查询 50 部最新电影及其海报时,就只加载需要的信息。如果用户点击一部电影,网站会执行另一次查询,以找到与该电影相关的 movie_metadata
文档。这种新模式比原来的模式性能更高,因为最常见的查询返回的文档要少得多。
考虑您的用例,特别是您最常执行的操作,设计能有效使用工作集的模式。
了解详情
要了解有关 MongoDB 数据建模和灵活的模式模型的更多信息,请参阅数据建模简介。
要了解有关使用引用对模式进行建模的更多信息,请参阅使用文档引用对一对多关系进行建模。
MongoDB 还提供免费的 MongoDB University 数据建模课程:MongoDB 的数据建模
设计模式(Design Patterns)
要了解将工作集中的文档保持在可管理大小的策略,请参阅以下模式:
MongoDB.live 2020 演讲
要了解如何将灵活数据模型整合到您的架构中,请参阅 MongoDB.live 2020 中的以下演示文稿:
通过 MongoDB 数据建模了解 MongoDB 中的实体关系及其实现示例。
通过高级模式设计模式了解您可以整合到模式的高级数据建模设计模式。