Usar o padrão de herança
Nesta página
Use o padrão de herança quando seus documentos forem em sua maioria semelhantes e você quiser mantê-los na mesma coleção para que possam ser lidos juntos. O padrão de herança utiliza uma entidade principal com campos comuns para agrupar entidades filhas que têm formulários variáveis. As entidades filhas podem ter campos únicos, mas estão intimamente relacionadas entre si devido a seus campos comuns.
Sobre esta tarefa
Neste exemplo, uma biblioteca utiliza o padrão de herança para armazenar diferentes tipos de mídia. Uma entidade pai book
armazena campos comuns como title
e author
, e várias entidades filhas herdam da entidade book
. Por exemplo , livros de áudio, livros impressos e e-books têm campos comuns e também têm campos únicos específicos para o tipo de mídia.
O padrão de herança armazena essas entidades ligeiramente diferentes na mesma coleção, o que melhora o desempenho para consultas que precisam acessar todos os livros, independentemente do tipo.
Passos
Insira os dados de amostra
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 } ] )
Os documentos anteriores compartilham alguns campos comuns e têm campos exclusivos dependendo do product_type
. Por exemplo:
ebook
documentos têm um campodownload_url
.audiobook
documentos têm um campotime_by_chapter
.physical_book
documentos têm um campodelivery_time
.
Consultar todos os documentos
Embora os documentos na coleção books
tenham formas diferentes, você pode retornar todos os documentos com uma única query:
db.books.find()
Saída:
[ { _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 } ]
Consultar campos únicos
O padrão de herança não exige lógica adicional para executar queries de campos específicos de um determinado tipo de mídia. Por exemplo, a query a seguir retorna livros com duração superior a 20 horas, que só se aplica ao tipo de produto audio_book
:
db.books.find( { "duration.hours": { $gt: 20 } } )
Saída:
[ { _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' } ] } ]