Almacene datos polimórficos cuando necesite acceder a documentos que tienen diferentes campos o tipos de datos juntos en la misma consulta.
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, su aplicación almacena atletas profesionales que practican diferentes deportes. Sus consultas acceden a todos los atletas, pero los atributos almacenados para cada uno varían según su deporte.
El patrón polimórfico almacena diferentes formas de documentos en la misma colección, lo que mejora el rendimiento de las consultas que necesitan acceder a todos los atletas independientemente del 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" ] } ] )
Consultar todos los documentos.
Aunque los documentos en el athletes La colección tiene diferentes campos, puedes devolver todos los documentos con una sola consulta:
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' ] } ]
Consultar campos únicos.
El patrón polimórfico no requiere lógica adicional para consultar campos específicos de un deporte en particular. Por ejemplo, la siguiente consulta devuelve atletas con más de 20 victorias en Grand Slam, lo que solo aplica a los 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' ] } ]