Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ /

비대해진 문서

이 페이지의 내용

  • 이 작업에 대하여
  • 예시
  • $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 컬렉션 만 사용됩니다. 사용자가 학습 보려고 책을 선택하면 웹사이트 는 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.

돌아가기

불필요한 인덱스 제거