Armazenar dados polimórficos
Nesta página
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.
Sobre esta tarefa
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.
Passos
Insira os dados de amostra
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 os documentos
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' ] } ]
Consultar campos únicos
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' ] } ]