Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

Armazenar dados polimórficos

Nesta página

  • Sobre esta tarefa
  • Passos
  • Saiba mais

Armazene dados polimórficos quando precisar acessar documentos que tenham campos ou tipos de dados diferentes juntos na mesma query.

O MongoDB usa um modelo de dados flexível, o que significa que documentos em uma única collection não precisam ter a mesma estrutura. Dados polimórficos são dados em uma única coleção que variam em campos de documento ou tipos de dados.

Neste exemplo, seu aplicação armazena atletas profissionais que jogam diferentes esportes. Suas queries acessam todos os atletas, mas os atributos armazenados para cada Atleta variam dependendo do esporte.

O padrão polimórfico armazena diferentes formas de documento na mesma coleção, o que melhora o desempenho das consultas que precisam acessar todos os atletas, independentemente do esporte.

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

Embora os documentos na coleção athletes tenham campos diferentes, você pode retornar todos os documentos com uma única query:

db.athletes.find()

Saída:

[
{
_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

O padrão polimórfico não exige lógica adicional para fazer query de campos específicos de um esporte específico. Por exemplo, a query a seguir retorna Atletas que têm mais de 20 vitórias no Grand Slam, que se aplica apenas a Atletas que jogam Tênis:

db.athletes.find(
{ grand_slam_wins: { $gt: 20 } }
)

Saída:

[
{
_id: ObjectId('6706cd8a6fd2c3b24f2e7e8d'),
sport: 'tennis',
name: 'Steffi Graf',
career_earnings: 21000000,
grand_slam_wins: 22,
surfaces: [ 'grass', 'clay', 'hard court' ]
}
]
  • Usar o padrão de herança

  • Validação de esquema

  • Crie índices para oferecer suporte a suas queries

Voltar

Dados polimórficos