상속 패턴 사용
문서가 대부분 유사하고 함께 읽을 수 있도록 동일한 컬렉션 에 유지하려는 경우 상속 패턴 을 사용합니다. 상속 패턴 은 공통 필드가 있는 상위 엔터티를 사용하여 가변 형식이 있는 하위 엔터티를 그룹 합니다. 하위 엔터티는 고유한 필드를 가질 수 있지만 공통 필드로 인해 서로 밀접하게 관련되어 있습니다.
이 작업에 대하여
이 예시 에서 저장 은 상속 패턴 을 사용하여 다양한 유형의 미디어 를 저장 합니다. book
상위 엔터티는 title
및 author
와 같은 공통 필드를 저장하며 여러 하위 엔터티가 book
엔터티에서 상속됩니다. 예를 예시 오디오북, 인쇄물, 전자책에는 공통 필드가 있으며 미디어 유형에 특정한 고유 필드도 있습니다.
상속 패턴 은 이처럼 약간 다른 엔터티를 동일한 컬렉션 에 저장하므로 유형에 관계없이 모든 책에 액세스 해야 하는 쿼리의 성능이 향상됩니다.
단계
샘플 데이터 삽입
db.books.insertMany( [ { product_type: "ebook", title: "Practical MongoDB Aggregations", author: "Paul Done", rating: 4.8, genres: [ "programming" ], pages: 338, download_url: "<url>" }, { product_type: "audiobook", title: "Practical MongoDB Aggregations", author: "Paul Done", rating: 4.6, genres: [ "programming" ], narrators: [ "Paul Done" ], duration: { hours: 21, minutes: 8 }, time_by_chapter: [ { chapter: 1, start: "00:00:00", end: "01:00:00" }, { chapter: 2, start: "01:00:00", end: "01:55:00" } ] }, { product_type: "physical_book", title: "Practical MongoDB Aggregations", author: "Paul Done", rating: 4.9, genres: [ "programming" ], pages: 338, stock: 12, delivery_time: 2 } ] )
앞의 문서는 몇 가지 공통 필드를 주식 하며 product_type
에 따라 고유한 필드를 갖습니다. 예를 예시 다음과 같습니다.
ebook
문서에download_url
필드 가 있습니다.audiobook
문서에time_by_chapter
필드 가 있습니다.physical_book
문서에delivery_time
필드 가 있습니다.
모든 문서 쿼리
books
컬렉션 의 문서는 모양이 다르지만 단일 쿼리 로 모든 문서를 반환할 수 있습니다.
db.books.find()
출력:
[ { _id: ObjectId('66eb4160ef006be6eda8e2ee'), product_type: 'ebook', title: 'Practical MongoDB Aggregations', author: 'Paul Done', rating: 4.8, genres: [ 'programming' ], pages: 338, download_url: '<url>' }, { _id: ObjectId('66eb4160ef006be6eda8e2ef'), product_type: 'audiobook', title: 'Practical MongoDB Aggregations', author: 'Paul Done', rating: 4.6, genres: [ 'programming' ], narrators: [ 'Paul Done' ], duration: { hours: 21, minutes: 8 }, time_by_chapter: [ { chapter: 1, start: '00:00:00', end: '01:00:00' }, { chapter: 2, start: '01:00:00', end: '01:55:00' } ] }, { _id: ObjectId('66eb4160ef006be6eda8e2f0'), product_type: 'physical_book', title: 'Practical MongoDB Aggregations', author: 'Paul Done', rating: 4.9, genres: [ 'programming' ], pages: 338, stock: 132, delivery_time: 2 } ]
고유 필드 쿼리
상속 패턴 은 특정 미디어 유형에 특정한 필드를 쿼리 하기 위해 추가 로직이 필요하지 않습니다. 예를 예시, 다음 쿼리 는 기간이 20 시간보다 긴 책을 반환하며, 이는 제품 유형 audio_book
에만 적용됩니다.
db.books.find( { "duration.hours": { $gt: 20 } } )
출력:
[ { _id: ObjectId('66eb4160ef006be6eda8e2ef'), product_type: 'audiobook', title: 'Practical MongoDB Aggregations', author: 'Paul Done', rating: 4.6, genres: [ 'programming' ], narrators: [ 'Paul Done' ], duration: { hours: 21, minutes: 8 }, time_by_chapter: [ { chapter: 1, start: '00:00:00', end: '01:00:00' }, { chapter: 2, start: '01:00:00', end: '01:55:00' } ] } ]