对数据进行建模以控制模式版本
Overview
有时需要更新数据库模式。例如,设计用于保存用户联系信息的模式可能需要进行更新,以包含开始普及的新通信方法,例如 Twitter 或 Skype。
您可以使用 MongoDB 灵活的模式模型来逐步更新集合的模式,该模式支持在同一集合中包含不同结构的文档。更新模式模型时,您可以借助模式版本控制模式使用版本号追踪这些更新。您的应用程序代码可以使用版本号来识别和处理具有不同结构的文档,而无需停机。
模式版本控制模式
要实现模式版本控制模式,请在首次修改模式时向模式添加 schema_version
(或类似名称)字段。使用新模式的文档应包含值为 2
的 schema_version
,以表明它们遵循模式的第二次迭代。如果您再次更新模式,请递增 schema_version
。
您的应用程序代码可以使用文档的 schema_version
属性,或者根据其缺乏该属性的情况来有条件地处理文档。使用最新模式在数据库中存储新信息。
例子
以下示例迭代 users
集合中文档的模式。
在该模式的第一次迭代中,一条记录包括 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_version
为2
,应用程序将返回的文档传递给呈现新contact_method.work
和contact_method.home
字段的专用函数。
使用schema_version
字段,应用程序代码可以通过向代码添加专用处理程序函数,支持同一集合中任意数量的模式迭代。
用例
模式版本控制模式非常适合以下任何一种情况或以下多种情况的组合:
应用程序停机不是一种选项
更新文档可能需要数小时、数天或数周的时间才能完成
不需要将文档更新到新的架构版本
相对于传统的表格型数据库,模式版本控制模式有助于更好地决定何时以及如何进行数据迁移。