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.
Acerca de esta tarea
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.
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 según el product_type. Por ejemplo:
ebookLos documentos tienen un campodownload_url.audiobookLos documentos tienen un campotime_by_chapter.physical_bookLos documentos tienen un campodelivery_time.
Consultar todos los documentos.
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 } ]
Consultar campos únicos.
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' } ] } ]