文档菜单
文档首页
/
MongoDB 手册
/ /

膨胀文档

在本页

  • 关于此任务
  • 示例
  • 使用$lookup连接集合
  • 了解更多

存储相关但未一起访问的数据字段可能会创建膨胀的文档,导致过度使用RAM和带宽。工作集,包括频繁访问的数据和索引,存储在RAM配额中。当工作集适合RAM时,MongoDB可以从内存而不是从磁盘查询,从而提高性能。然而,如果文档太大,工作集可能无法适应RAM,导致性能下降,因为MongoDB必须从磁盘访问数据。工作集,由频繁访问的数据和索引组成,存储在RAM配额中。当工作集适合RAM时,MongoDB可以从内存而不是从磁盘查询,从而提高性能。然而,如果文档太大,工作集可能无法适应RAM,导致性能下降,因为MongoDB必须从磁盘访问数据。

为了防止文档膨胀,使用较小的文档重构模式,并使用文档引用来分离不一起返回的字段。这种方法可以减少工作集大小并提高性能。

考虑以下模式,该模式包含在书店网站主页上使用的书籍信息。主页仅显示书籍标题、作者和封面图像。您必须点击书籍才能查看其他详细信息。

{
title: "Tale of Two Cities",
author: "Charles Dickens",
genre: "Historical Fiction",
cover_image: "<url>",
year: 1859,
pages: 448,
price: 15.99,
description: "A historical novel set during the French Revolution.
}

在当前模式中,要显示网站主页的信息,必须查询所有书籍信息。为了减少文档大小并简化查询,可以将大型文档拆分为两个较小的集合。

在下面的示例中,书籍信息被分为两个集合mainBookInfoadditionalBookDetails

  • mainBookInfo 集合包含在网站主页上显示的信息。

  • additionalBookDetails 集合包含用户点击书籍后显示的额外细节。

mainBookInfo 集合

db.mainBookInfo.insertOne(
{
_id: 1234,
title: "Tale of Two Cities",
author: "Charles Dickens",
genre: "Historical Fiction",
cover_image: "<url>"
}
)

additionalBookDetails 集合

db.additionalBookDetails.insertOne(
{
title: "Tale of Two Cities",
bookId: 1234,
year: 1859,
pages: 448,
price: 15.99,
description: "A historical novel set during the French Revolution."
}
)

这两个集合通过 mainBookInfo 集合中的 _id 字段和 additionalBookDetails 集合中的 bookId 字段相连接。在主页上,只使用 mainBookInfo 集合提供必要的信息。当用户选择一本书以了解更多信息时,网站使用 _id 字段来查询 additionalBookDetails 集合,并与 bookId 字段匹配。

通过将信息分为两个集合,您可以确保您的文档不会变得过大,从而超过 RAM 配额。

为了连接来自 mainBookInfo 集合和 additionalBookDetails 集合的数据,应用程序需要执行 $lookup 操作。

以下聚合操作连接了先前的示例中的 mainBookInfoadditionalBookDetails 集合。

db.mainBookInfo.aggregate( [
{
$lookup: {
from: "additionalBookDetails",
localField: "_id",
foreignField: "bookId",
as: "details"
}
},
{
$replaceRoot: {
newRoot: { $mergeObjects: [ { $arrayElemAt: [ "$details", 0 ] }, "$$ROOT" ] }
}
},
{
$project: { details: 0 }
}
] )

操作返回以下内容

[
{
_id: ObjectId('666b1235eda086b5e22dbcf1'),
title: 'Tale of Two Cities',
author: 'Charles Dickens',
genre: 'Historical Fiction',
cover_image: '<url>',
bookId: 1234,
year: 1859,
pages: 448,
price: 15.99,
description: 'A historical novel set during the French Revolution.'
}
]

在本例中,$lookup 操作通过 _idbookId 字段将 mainBookInfo 集合与 additionalBookDetails 集合并联。$mergeObjects$replaceRoot 操作将来自 mainBookInfoadditionalBookDetails 集合的合并文档合并。

返回

删除不必要的索引