Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
/ / /

Utiliza el patrón de herencia

Utiliza el patrón de herencia cuando tus documentos sean mayormente similares y desees 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 que tienen 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. A book la entidad principal almacena campos comunes como title y author, y múltiples entidades hijas heredan de la entidad book. Por ejemplo, los audiolibros, los libros impresos y los ebooks tienen campos comunes y también tienen 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 query 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 dependiendo del product_type. Por ejemplo:

  • ebook documentos tienen un campo download_url.

  • audiobook documentos tienen un campo time_by_chapter.

  • physical_book documentos tienen un campo delivery_time.

2

Aunque los documentos en la colección books tienen diferentes estructuras, puedes retornar todos los documentos con una sola query:

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 una lógica adicional para query campos específicos de un tipo de medio particular. Por ejemplo, la siguiente query devuelve libros que tienen una duración superior a 20 horas, que solo se 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