存储多态数据
当您需要在同一查询中访问具有不同字段或数据类型的文档时,请存储多态数据。
MongoDB 使用灵活的数据模型,这意味着同一集合中的文档不需要具有相同的结构。多态数据是指在同一集合中,文档的字段或数据类型可能不同的数据。
关于此任务
在此示例中,您的应用程序存储了从事不同运动的职业运动员。您的查询访问所有运动员,但每个运动员存储的属性取决于其运动。
多态模式在同一集合中存储不同的文档形状,这提高了需要访问所有运动员(无论运动类型如何)的查询性能。
步骤
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
查询所有文档
尽管“运动员”集合中的文档有不同的字段,您仍然可以通过单个查询返回所有文档运动员
集合中的文档字段不同,但您可以使用单个查询返回所有文档
db.athletes.find()
输出
[ { _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
查询唯一字段
多态模式不需要额外的逻辑即可查询特定于某个运动项目的字段。例如,以下查询返回的是赢得20场大满贯胜利的运动员,这仅适用于网球运动员
db.athletes.find( { grand_slam_wins: { $gt: 20 } } )
输出
[ { _id: ObjectId('6706cd8a6fd2c3b24f2e7e8d'), sport: 'tennis', name: 'Steffi Graf', career_earnings: 21000000, grand_slam_wins: 22, surfaces: [ 'grass', 'clay', 'hard court' ] } ]