ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Docs Menu

비대해진 문서

서로 관련되어 있지만 함께 액세스하지 않는 데이터 필드를 저장하면 문서가 비대해져 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 컬렉션 만 사용됩니다. 사용자가 학습 보려고 책을 선택하면 웹사이트 는 bookId 필드 와 일치하는 _id 필드 를 사용하여 additionalBookDetails 컬렉션 을 쿼리합니다.

정보를 두 개의 컬렉션으로 분할하면 문서가 너무 커지거나 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 컬렉션 과 조인합니다. The $mergeObjects and $replaceRoot operations merge the joined documents from the mainBookInfo and additionalBookDetails collections.