Docs Menu
Docs Home
/ /
/ / /

Utilice el patrón de herencia

Utilice el patrón de herencia cuando sus documentos sean en su mayoría similares y desee mantenerlos en la misma colección para que puedan leerse juntos. El patrón de herencia utiliza una entidad principal con campos comunes para agrupar entidades secundarias con formas variables. Las entidades secundarias pueden tener campos únicos, pero están estrechamente relacionadas entre sí debido a sus campos comunes.

En este ejemplo, una librería utiliza el patrón de herencia para almacenar diferentes tipos de medios. book La entidad principal almacena campos comunes como title y author, y varias entidades secundarias heredan de la entidad book. Por ejemplo, los audiolibros, los libros impresos y los libros electrónicos tienen campos comunes y también campos únicos específicos del tipo de medio.

El patrón de herencia almacena estas entidades ligeramente diferentes en la misma colección, lo que mejora el rendimiento de las consultas que necesitan acceder a todos los libros, independientemente del 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
}
] )

Los documentos anteriores comparten algunos campos comunes y tienen campos únicos según el product_type. Por ejemplo:

  • ebook Los documentos tienen un campo download_url.

  • audiobook Los documentos tienen un campo time_by_chapter.

  • physical_book Los documentos tienen un campo delivery_time.

2

Aunque los documentos de la colección books tengan formas diferentes, puedes devolver todos los documentos con una sola consulta:

db.books.find()

Salida:

[
{
_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

El patrón de herencia no requiere lógica adicional para consultar campos específicos de un tipo de medio. Por ejemplo, la siguiente consulta devuelve libros con una duración superior a 20 horas, lo que solo aplica al tipo de producto audio_book:

db.books.find(
{
"duration.hours": { $gt: 20 }
}
)

Salida:

[
{
_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' }
]
}
]
  • Almacenar datos polimórficos

  • Validación de esquema

  • Crea índices para apoyar tus consultas

Volver

Patrón polimórfico

Obtén una insignia de habilidad

¡Domina "Patrones y antipatrones de diseño de esquemas" de forma gratuita!

Más información

En esta página