Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

Usar o padrão de herança

Nesta página

  • Sobre esta tarefa
  • Passos
  • Saiba mais

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.

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.

1
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 campo download_url .

  • audiobook documentos têm um campo time_by_chapter .

  • physical_book documentos têm um campo delivery_time .

2

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
}
]
3

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' }
]
}
]
  • Armazenar dados polimórficos

  • Validação de esquema

  • Crie índices para oferecer suporte a suas queries

Voltar

Padrão polimórfico