Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
/ / /

Almacenar datos polimórficos

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.

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.

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

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

  • Validación de esquema

  • Crea índices para apoyar tus consultas

Volver

Datos polimórficos

En esta página