gpt4 book ai didi

mongodb - 如何正确处理 Mongoose 模式迁移?

转载 作者:IT老高 更新时间:2023-10-28 11:07:44 25 4
gpt4 key购买 nike

我对 MongoDB 和 Mongoose 完全陌生,似乎无法找到关于在架构更改时如何处理迁移的答案。

我习惯于运行迁移 SQL 脚本来更改表结构和任何需要更改的基础数据。这通常涉及数据库停机时间。

这通常在 MongoDB/Mongoose 中如何处理?有什么我需要注意的问题吗?

最佳答案

在遇到这种情况并合理地理解迁移如何在关系数据库上工作时,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 );
})

2) 您希望应用程序根据正在运行的应用程序版本上下迁移模式。这对于实时服务器来说显然会减轻负担并且不需要停机时间,因为只有在用户第一次使用升级/降级版本时才会升级。

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

  • 通过 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
    })

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

关于mongodb - 如何正确处理 Mongoose 模式迁移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18295357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com