Docs Menu
Docs Home
/ /
/ / /

Almacenar datos polimórficos

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.

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.

1
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" ]
}
] )
2

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' ]
}
]
3

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' ]
}
]
  • Utilice el patrón de herencia

  • Validación de esquema

  • Crea índices para apoyar tus consultas

Volver

Datos polimórficos

En esta página