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

维护不同的模式版本

在此页面上

  • 关于此任务
  • 开始之前
  • 步骤
  • 向集合中添加 schemaVersion 字段
  • 插入具有更新后模式的文档
  • 后续步骤
  • 查询集合
  • 更新集合中的文档
  • 了解详情

应用程序的架构要求可能会随着时间的推移而改变。例如,当新服务可用时,您可能需要向文档中添加新字段。MongoDB 灵活的数据模型意味着您可以在整个集合中使用非统一的文档结构,并且可以在更新架构的同时保留旧的文档结构。

通过模式版本控制模式,您可以在同一个集合中拥有不同版本的模式,从而避免在需求发生变化时进行大规模的模式迁移。

如果字段在文档中的不同级别出现,则模式版本控制模式可能会影响索引。例如,如果将同一字段作为顶级字段和嵌入字段存储到不同的文档中,则可能需要多个索引来支持对相应字段的查询。

在以下示例中,一家在线商店使用一个集合来跟踪客户联系信息。起初,该集合仅包含家庭和工作电话号码。随着时间的推移,新的联系方式不断增加,该商店已不再需要一些旧的联系方式。

插入示例文档:

db.contacts.insertOne(
{
_id: 1,
name: "Taylor",
home: "209-555-7788",
work: "503-555-0110"
}
)

以下过程设置集合的初始模式版本,然后插入具有不同模式的新文档。

1

要区分集合中的不同模式,请添加 schemaVersion字段。

以下命令将值为 1schemaVersion 字段添加到具有初始模式的文档中:

db.contacts.updateMany(
{ },
{
$set: { schemaVersion: 1 }
}
)
2

在更新的模式中,客户可以链接他们的社交媒体帐户。插入一份说明新要求的文件,并且其 schemaVersion2

db.contacts.insertOne(
{
_id: 2,
schemaVersion: 2,
name: "Cameron",
contactInfo: {
cell: "903-555-1122",
work: "670-555-7878",
instagram: "@camcam9090",
linkedIn: "CameronSmith123"
}
}
)

实现 Schema Versioning Pattern 之后,您需要修改应用程序如何查询和更新数据。

既然contacts集合中有两个不同的模式,那么查询必须根据文档的模式版本检查字段值的所有可能位置。

以下查询根据客户的work号进行搜索。该查询会检查work字段的两个可能位置:

db.contacts.find(
{
$or: [
{
work: "503-555-0110"
},
{
"contactInfo.work": "503-555-0110"
}
]
}
)

输出:

{
_id: 1,
name: 'Taylor',
home: '209-555-7788',
work: '503-555-0110',
schemaVersion: 1
}

与插入数据类似,当您更新集合时,应用程序必须检查要更新字段的所有可能位置。更新数据时,可以使用 schemaVersion 字段来确定要更新的字段。

如要使用 _id: 2 更新用户的 work 电话号码,请运行以下命令:

db.contacts.updateOne(
{ _id: 2 },
[
{
$set: {
"work": {
$cond: {
if: { $eq: [ "$schemaVersion", 1 ] },
then: "999-999-9999",
else: null
}
},
"contactInfo.work": {
$cond: {
if: { $eq: [ "$schemaVersion", 2 ] },
then: "999-999-9999",
else: null
}
}
}
}
]
)

在上一个示例中:

  • 如果匹配文档的 schemaVersion1,则 work 字段将设置为更新后的值。

  • 如果匹配文档的 schemaVersion2,则 contactInfo.work 字段将设置为更新后的值。

  • 保留文档版本历史记录

  • 模式验证

  • 架构设计过程

后退

保留文档历史记录