비대해진 문서
이 페이지의 내용
서로 관련되어 있지만 함께 액세스하지 않는 데이터 필드를 저장하면 문서가 비대해져 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
컬렉션 만 사용됩니다. 사용자가 학습 보려고 책을 선택하면 웹사이트 는 bookId
필드 와 일치하는 _id
필드 를 사용하여 additionalBookDetails
컬렉션 을 쿼리합니다.
정보를 두 개의 컬렉션으로 분할하면 문서가 너무 커지거나 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
컬렉션 과 조인합니다. The $mergeObjects
and $replaceRoot
operations merge the joined documents from the mainBookInfo
and additionalBookDetails
collections.