Docs 菜单
Docs 主页
/
MongoDB Atlas
/ /

减少大型文档的大小

在此页面上

  • 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 部最新电影的 titleposter。与其查询所有电影信息,不如考虑将 movie 集合拆分成 moviesmovie_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.live 2020 中的以下演示文稿:

后退

删除未使用的索引