使用MongoDb处理迁移



为了给这个问题提供更多的上下文,我有一个web应用程序(asp-mvc),它基本上将CRUD操作封装到MongoDb实例中,它在验证模型并发送到存储、检索等之前执行验证和某些业务逻辑。

现在我们遇到的一个问题是,在新版本中,模型发生了变化,但现有数据没有变化,这里有一个例子:(它是c#特定的,但问题实际上是语言不可知的)

public class Person
{
    public Guid Id {get; set;}
    public string Name {get; set;}
    public int Age {get;set;}
    public string BadgeNo {get;set;}
}
public class Person
{
    public Guid Id {get; set;}
    public string Name {get; set;}
    public int Age {get;set;}
    public string EmployeeNo {get; set;} // Still contains same data as BadgeNo just called something different
}

正如你所看到的,对象的结构已经改变,但在Mongo的土地上,它仍然发出BadgeNo,而不是EmployeeNo。在SQL环境中,我们通常会有一个迁移脚本,它作为构建脚本的一部分运行,它会更改模式并更新/插入/删除该增量的任何其他数据。

那么,如何最好地使用Mongo管理此类迁移呢?我应该也有一个脚本来更新Mongo中的所有实例吗?或者有没有其他喜欢做这类事情的做法。

任何关于这个问题的建议都是很棒的

===编辑===

目前看来,我想采用迁移选项,而不是逐步淘汰的方法,因此,考虑到这一点,任何人都可以推荐任何工具来帮助这一领域,因为否则,每个迁移(假设引入、推出)都必须是某种预编译的程序集,其中包含所有逻辑。我想的是FluentMigrator,但不是使用SQL,而是使用Mongo。目前我的构建脚本正在使用Nant,我看到了一些ruby工具,但不确定是否有等效的.net。

基本上有两种方法:

  1. 确保您的应用程序代码既能处理数据结构的"版本",也能在保存时处理对新结构的更新
  2. 编写迁移脚本

我可能会选择选项1,因为它是一种允许您逐步更新的方法,与选项2一样,您基本上需要关闭您的应用程序,以便一次性更新代码(快速)和数据(可能较慢)。

然后稍后,或者如果您觉得有必要,也可以选择选项2迁移数据。这样就不必关闭你的网站,并且可以很高兴地在后台异步运行。

目前我似乎想采用迁移选项,而不是逐步淘汰的方法,所以考虑到这一点,任何人都可以推荐任何工具来帮助

对于那些仍在寻找解决方案的人来说,看看MongoMigrations,这个工具公开了MongoDatabase(来自mongo-csharp驱动程序),用于对数据库进行操作,这样你就可以使用驱动程序中的所有功能。

策略可能有所不同。它们取决于特定的应用。当然,对于像Facebook这样的网站,你会选择Derick提出的选项#1,以完全不影响你的用户,但如果你有"销售披萨"的网站,你肯定不想努力支持两个版本(当前和新版本),写更复杂的代码,等等。

对于这类应用程序,简单的补丁可能是更好的选择:

  1. 生成服务器将应用程序发送到"读取模式",这样任何人都可以读取,但不能向数据库中插入任何内容
  2. 当prod处于读取模式时,我正在获取数据库并应用补丁
  3. 一旦修补完成,它就备份数据库,停止web服务器,部署新的数据库和新的应用程序

将应用程序发送到读取模式可以减少停机时间,但对于"销售披萨"的网站,您不需要读取模式。

最新更新