Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

臃肿的文档

在此页面上

  • 关于此任务
  • 例子
  • 使用 $lookup 连接集合
  • 了解详情

存储彼此相关但不一起访问的数据字段可能会创建臃肿的文档,从而导致RAM和带宽使用过多。 工作集由经常访问的数据和索引组成,存储在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集合的联接文档。

后退

删除不必要的索引