使用 Mongock 按环境dev、pprod、prod使用特定数据初始化数据库的最佳方法

问题描述

我正在使用 Mongock 来初始化一个带有一些配置的 MongoDb 数据库,通过调用系统授权用户的数组。 <div class="sidebar" [class.opened]="sidenav$ | async"> // I get this only when I drag or click or move in browser </div>

我的问题来自这样一个事实,即在开发用户 1 和用户 2 中获得授权,但在生产中只有用户 1 获得授权。

  • 当我们搜索授权用户时,添加一个 env 属性 {systemId: 'a',authorizedUsers: ['user1',user2]} 并将其用作过滤器是否更好?缺点是数据库中有不同的配置可用,我们需要选择正确的配置。
  • 或者最好在 Mongock init 函数(ChangeSet)中读取 Mongock 运行所在的环境并初始化正确的数据?缺点是我们无法在进入正确环境之前测试 init 的正确性
  • 更好的解决方案?

提前感谢您的回复

编辑以澄清两个选项

  • 选项 1
{env: 'dev',systemId: 'a',user2]}


    @ChangeLog
    public class UsersChangeLogs {
    
     @ChangeSet(...)
     public void addUsers() {
     //add dev users {env: 'dev','user2']}
     //add prod users {env: 'prod','user2']}
     }
    
    }

  • 选项 2:(由@Mongock 团队提出)(已选择)

    @Service
    class AuthorizedUsers {
     @Value("env")
     private String env;
     List<User> getAuthorizedUsers() {
      return db.users.filter(env)
    }
    }

解决方法

如果我没猜错的话,我看到这个问题有两部分

  1. 在哪里存储用户的配置/如何将其传递给 Mongock
  2. 根据该配置,初始化您的 MongoDB 数据库。

我想我们都同意第二步很明确:Mongock 以某种方式获取配置并执行迁移。

关于如何向 Mongock 提供该配置,在您的第一个选项中,您提到为环境添加一个字段,对吗?您是说生产环境和开发环境使用相同的数据库吗?在我看来,除非你有充分的理由,否则我不建议这样做。在我的理想世界中,每个环境都有一个数据库,因此不需要环境字段。 Mongock 只需要从之前添加的那个集合中获取信息。

然后问题是如何将有关用户的配置数据添加到数据库中。如果它可以从您的 Java 代码中硬编码,您可以在 Mongock 中轻松完成。如果您使用的是 Spring,您可以使用 @Profile 来计算在哪个环境中执行哪个 changeLog。

如果没有,另一个想法是将这些用户作为环境变量或配置传递。如果您使用 kubernetes,这种工具的 ansible,通过环境变量提供它并不是一个坏主意。但我想我没有足够的信息来对任何选项做出更多承诺。

@Profile("dev")
@ChangeLog
public class DevUsersChangeLogs {

 @ChangeSet(...)
 public void addUsers() {
 //add users {systemId: 'a',authorizedUsers: ['user1','user2']}
 }

}

@Profile("prod")
@ChangeLog
public class ProdUsersChangeLogs {

 @ChangeSet(...)
 public void addUsers() {
 //add users {systemId: 'a',authorizedUsers: ['user1']}
 }

}

然后您可以根据您的用户执行迁移

@ChangeLog
public class ProperMigration {

 @ChangeSet(...)
 public void changeSetMethod() {
 //migration code
 }


}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...