Almacena datos polimórficos cuando necesites acceder a documentos que tengan diferentes campos o tipos de datos juntos en la misma query.
MongoDB utiliza un modelo de datos flexible, lo que significa que los documentos de una misma colección no necesitan tener la misma estructura. Los datos polimórficos son datos de una misma colección que varían en campos o tipos de datos.
Acerca de esta tarea
En este ejemplo, tu aplicación almacena atletas profesionales que practican diferentes deportes. Tus queries acceden a todos los atletas, pero los atributos almacenados para cada atleta varían según su deporte.
El patrón polimórfico almacena diferentes formas de documentos en la misma colección, lo cual mejora el rendimiento para las consultas que necesitan acceder a todos los atletas, sin importar el deporte.
Pasos
Inserte los datos de muestra.
db.athletes.insertMany( [ { sport: "bowling", name: "Earl Anthony", career_earnings: 1440000, perfect_games: 25, pba_championships: 43, events: [ { name: "japan_pba", score: 300, year: 1972 } ] }, { sport: "tennis", name: "Steffi Graf", career_earnings: 21000000, grand_slam_wins: 22, surfaces: [ "grass", "clay", "hard court" ] }, { sport: "cricket", name: "Sachin Tendulkar", career_earnings: 8000000, runs: 15921, centuries: 51, teammates: [ "Arshad Ayub", "Kapil Dev" ] } ] )
Query todos los documentos.
Aunque los documentos en el athletes la colección tiene diferentes campos, puedes devolver todos los documentos con una sola query:
db.athletes.find()
Salida:
[ { _id: ObjectId('6706dcd66fd2c3b24f2e7e92'), sport: 'bowling', name: 'Earl Anthony', career_earnings: 1440000, perfect_games: 25, pba_championships: 43, events: [ { name: 'japan_pba', score: 300, year: 1972 } ] }, { _id: ObjectId('6706dcd66fd2c3b24f2e7e93'), sport: 'tennis', name: 'Steffi Graf', career_earnings: 21000000, grand_slam_wins: 22, surfaces: [ 'grass', 'clay', 'hard court' ] }, { _id: ObjectId('6706dcd66fd2c3b24f2e7e94'), sport: 'cricket', name: 'Sachin Tendulkar', career_earnings: 8000000, runs: 15921, centuries: 51, teammates: [ 'Arshad Ayub', 'Kapil Dev' ] } ]
query campos únicos.
El patrón polimórfico no requiere lógica adicional para consultar campos que son específicos de un deporte en particular. Por ejemplo, la siguiente query devuelve atletas que tienen más de 20 victorias de Grand Slam, lo cual solo aplica a atletas que juegan al tenis:
db.athletes.find( { grand_slam_wins: { $gt: 20 } } )
Salida:
[ { _id: ObjectId('6706cd8a6fd2c3b24f2e7e8d'), sport: 'tennis', name: 'Steffi Graf', career_earnings: 21000000, grand_slam_wins: 22, surfaces: [ 'grass', 'clay', 'hard court' ] } ]