Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

存储多态数据

在此页面上

  • 关于此任务
  • 步骤
  • 了解详情

当您需要在同一查询中同时访问权限具有不同字段或数据类型的文档时,请存储多态数据。

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

即使 athletes集合中的文档具有不同的字段,您也可以使用单个查询返回所有文档:

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' ]
}
]
  • 使用继承模式

  • 模式验证

  • 创建索引以支持查询

后退

多态数据