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.
Acerca de esta tarea
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.
Pasos
Inserte los datos de muestra.
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:
ebookdocumentos tienen un campodownload_url.audiobookdocumentos tienen un campotime_by_chapter.physical_bookdocumentos tienen un campodelivery_time.
Query todos los documentos.
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 } ]
query campos únicos.
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' } ] } ]