如何正确处理mongoose模式迁移?

haf*_*huk 31 mongoose mongodb

我是MongoDB和Mongoose的新手,似乎无法找到关于如何在架构更改时处理迁移的答案.

我习惯于运行迁移SQL脚本来改变表结构和需要更改的任何底层数据.这通常涉及DB停机时间.

这通常是如何在MongoDB/Mongoose中处理的?我需要注意的任何问题?

Rya*_*n Q 23

在了解这一点并合理地理解迁移如何在关系数据库上工作时,MongoDB使这一点变得更加简单.我有两种方法来打破这种局面.在处理MongoDB中的数据迁移时要考虑的事情(并非RDB中不常见):

  • 当开发人员合并项目存储库中的最新版本时,确保本地测试环境不会中断
  • 确保在实时版本上正确更新任何数据,无论用户是否已登录或注销,如果使用身份验证.(当然,如果在升级时每个人都自动注销,那么只需要担心用户何时登录).

1)如果您的更改将记录所有人或预计应用程序停机,那么执行此操作的简单方法是使用迁移脚本连接到本地或实时MongoDB并升级正确的数据.将用户名称从单个字符串更改为具有给定名称和族名称的对象的示例(当然非常基本,需要放入脚本以便为所有开发人员运行):

使用CLI:

mongod
use myDatabase
db.myUsers.find().forEach( function(user){
    var curName = user.name.split(' '); //need some more checks..

    user.name = {given: curName[0], family: curName[1]};
    db.myUsers.save( user );
})
Run Code Online (Sandbox Code Playgroud)

2)您希望应用程序根据它们运行的​​应用程序版本上下迁移模式.这显然不会对实时服务器造成负担,并且由于仅在第一次使用升级/降级版本时仅升级用户而不需要停机时间.

如果您在Expressjs中使用Nodejs中间件:

  • 在您的根应用程序脚本中设置一个app变量,app.set('schemaVersion', 1)稍后将使用该变量与用户架构版本进行比较.
  • 现在确保所有用户模式都具有schemaVersion属性,因此我们可以检测应用程序模式版本与仅特定用户的当前MongoDB模式之间的更改.
  • 接下来,我们需要创建简单的中间件来检测配置和用户版本

    app.use( function( req, res, next ){
      //If were not on an authenticated route
      if( ! req.user ){
        next();
        return;
      }
      //retrieving the user info will be server dependent
      if( req.user.schemaVersion === app.get('schemaVersion')){
        next();
        return;
      }
    
      //handle upgrade if user version is less than app version
    
      //handle downgrade if user version is greater than app version
    
      //save the user version to your session / auth token / MongoDB where necessary
    })
    
    Run Code Online (Sandbox Code Playgroud)

对于升级/降级,我将使用升级/降级导出功能在迁移目录下创建简单的js文件,这些函数将接受用户模型并在MongoDB中对该特定用户运行迁移更改.最后确保在MongoDB中更新用户版本,这样他们就不会再次运行更改,除非他们再次移动到其他版本.

  • 这是否意味着您可能拥有MongoDB中每个模式的中间件功能?这种方法有哪些表现或其他权衡取舍? (2认同)

arb*_*l84 10

有两种类型的迁移:

  • 离线:需要您停止服务进行维护,然后迭代整个集合并进行所需的更改。

  • 在线:不需要停止服务进行维护。当您阅读文档时,您会检查其版本,并为新旧版本之间的每个版本运行特定于版本的迁移例程。然后加载结果。

并非所有服务都能承担离线迁移的费用,我推荐在线方法。


mrB*_*rna 5

如果您习惯于进行SQL类型的迁移或类似Rails的迁移,那么您会发现我的cli工具migration -mongoose非常适合您。

它允许您使用updown函数编写迁移,并根据迁移的成功与失败为您管理状态。

如果您使用的是ES 2015语法,它也支持ES6。

您可以通过this对象访问猫鼬模型,从而可以轻松地对模型和模式进行所需的更改。