臃肿的文档
存储彼此相关但不一起访问的数据字段可能会创建臃肿的文档,从而导致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. }
在当前模式中,要显示网站主页的信息,必须查询所有图书信息。 要减小文档大小并简化查询,可以将大文档分割为两个较小的集合。
例子
在以下示例中,图书信息分割分为两个集合: mainBookInfo
和additionalBookDetails
。
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分配。
使用 $lookup 连接集合
要连接来自mainBookInfo
集合和additionalBookDetails
集合的数据,应用程序需要执行$lookup
操作。
以下聚合操作连接上一示例中的mainBookInfo
和additionalBookDetails
集合。
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
操作使用_id
和bookId
字段将mainBookInfo
集合与additionalBookDetails
集合连接起来。 $mergeObjects
和$replaceRoot
操作合并来自mainBookInfo
和additionalBookDetails
集合的联接文档。