使用MongoDb处理迁移

Gro*_*fit 15 .net migration mongodb database-schema

为了给这个问题提供更多的上下文,我有一个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
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,对象的结构发生了变化,但是在Mongo的土地上,它仍然传递出一个BadgeNo,而不是一个EmployeeNo.在SQL领域,我们通常会有一个迁移脚本,它作为构建脚本的一部分运行,它将更改架构并更新/插入/删除该增量的任何其他数据.

那么如何用Mongo 管理这类迁移呢?我是否还应该使用一个脚本来更新Mongo中的所有实例?还是有一些其他首选的做法来做这种事情.

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

===编辑===

目前我似乎想要使用迁移选项而不是逐步淘汰方法,所以考虑到这一点,任何人都可以推荐任何帮助这一领域的工具,否则每次迁移(假设滚入,推出) )必须是一个具有所有逻辑的预编译程序集.我正在思考FluentMigrator的内容,但不是使用SQL而是使用Mongo.目前我的构建脚本使用Nant,我看过一些ruby工具,但不确定是否有任何.net等价物.

Der*_*ick 14

基本上有两种方法:

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

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

然后,或者如果您发现有必要,请执行选项2以迁移数据.这不需要取下您的网站,并且可以愉快地在后台异步运行.

  • 问题是你正在编写大量过多的代码,你必须维护它们才能支持多个版本,并想象20个版本,你有20个文件,每个模型已经改变.对我来说第二个选项似乎更好,因为它更容易在版本之间移动(即回滚),我没有任何问题与少量的停机时间.谢谢你的回答会让这个开放时间长一点,因为我期待很多人说选项2,但是希望有关如何最好地自动化第二种方法的更多信息,即在构建脚本中. (2认同)