进入MongoDB中文手册(4.2版本)目录
1 概述
数据库模式(Database schemas)有时需要更新。例如,设计用来保存用户联系信息的模式(模式)可能需要更新,用来包括新的通信方法(例如Twitter或Skype),因为它们变得越来越流行。
您可以使用MongoDB的灵活模式模型(该模式模型支持同一集合中形状不同的文档)来逐步更新集合的模式。在更新模式模型时,模式版本控制模式(Schema Versioning pattern)允许您使用版本号跟踪这些更新。您的应用程序代码可以使用版本号来识别和处理形状不同的文档,而无需停机。
2 模式版本控制模式(Schema Versioning Pattern)
要实现模式(Schema )版本控制模式(Pattern),请在第一次修改模式(Schema )时向您的模式(Schema )添加一个schema_version (或类似名称的)字段。使用带有 schema_version为2的新模式(Schema )的文档,表明它们遵守模式(Schema )的第二次迭代。如果您再次更新模式(Schema ),请增加schema_version。
您的应用程序代码可以使用schema_version,或不使用它而通过条件来处理文件。使用最新模式(Schema )将新信息存储在数据库中。
3 示例
以下示例对users集合中的文档的模式(Schema )进行迭代 。
在此模式(Schema)的第一次迭代中,记录包括 galactic_id,name和phone字段:
// users collection
{
"_id": "<ObjectId>",
"galactic_id": 123,
"name": "Anakin Skywalker",
"phone": "503-555-0000",
}
在下一次迭代中,将对模式进行更新为其他形式并包含更多信息:
// users collection
{
"_id": "<ObjectId>",
"galactic_id": 123,
"name": "Darth Vader",
"contact_method": {
"work": "503-555-0210",
"home": "503-555-0220",
"twitter": "@realdarthvader",
"skype": "AlwaysWithYou"
},
"schema_version": "2"
}
添加一个schema_version字段,使应用程序可以识别针对新模式而成形的文档并进行相应的处理。如果文档schema_version上不存在旧应用程序,则该应用程序仍可以处理。
例如,考虑一个通过galactic_id查找用户电话号码的应用程序。给予galactic_id时,应用程序需要查询数据库:
db.users.find( { galactic_id: 123 } );
从数据库返回文档后,应用程序将检查文档是否具有schema_version字段。
- 如果没有schema_version字段,则应用程序将返回的文档传递给专用函数,该函数使用原始模式呈现phone 字段。
- 如果它确实具有schema_version字段,则应用程序将检查模式(Schema)版本。在此示例中,schema_versionis为2,且应用程序将返回的文档传递给呈现新字段contact_method.work和 contact_method.home字段的专用函数。
通过使用schema_version字段,应用程序代码可以通过向代码添加专用的处理函数来支持同一集合中的任意数量的模式迭代。
4 用例
模式版本化模式非常适合以下情况中的任何一种或组合:
- 无法关闭应用程序。
- 更新文件可能需要几个小时,几天或几周的时间才能完成。
- 不需要将文档更新到新的模式版本。
模式版本化模式可以帮助您更好地决定何时以及如何对传统的表数据库进行数据迁移。
进入MongoDB中文手册(4.2版本)目录