文档菜单
文档首页
/
MongoDB 手册
/ / /

存储多态数据

本页内容

  • 关于此任务
  • 步骤
  • 了解更多

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

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

  • 模式验证

  • 创建索引以支持您的查询

返回

多态数据