使用 Mongock 按环境(dev、pprod、prod)使用特定数据初始化数据库的最佳方法
Best way to init database with specific data by environment (dev, pprod, prod) using Mongock
我正在使用 Mongock 初始化一个 MongoDb 数据库,其中包含一些配置,一组通过调用系统获得授权的用户。 {systemId: 'a', authorizedUsers: ['user1', user2]}
.
我的问题来自这样一个事实,即在开发中 user1 和 user2 被授权,但在 prod 中只有 user1 被授权。
- 添加一个 env 属性
{env: 'dev', systemId: 'a', authorizedUsers: ['user1', user2]}
并在我们搜索授权用户时将其用作过滤器是否更好?缺点是在数据库中有不同的配置可用,我们需要选择正确的配置。
- 或者在 Mongock 初始化函数(ChangeSet)中读取 Mongock 运行 所在的环境并初始化正确的数据是否更好?缺点是我们无法在正确的环境之前测试init的正确性
- 更好的解决方案?
提前感谢您的回复
编辑以澄清两个选项
- 选项 1
@ChangeLog
public class UsersChangeLogs {
@ChangeSet(...)
public void addUsers() {
//add dev users {env: 'dev', systemId: 'a', authorizedUsers: ['user1', 'user2']}
//add prod users {env: 'prod', systemId: 'a', authorizedUsers: ['user1', 'user2']}
}
}
和
@Service
class AuthorizedUsers {
@Value("env")
private String env;
List<User> getAuthorizedUsers() {
return db.users.filter(env)
}
}
- 方案二:(@Mongock团队提出)(已选择)
@ChangeLog
public class UsersChangeLogs {
@Profile("dev")
@ChangeSet(...)
public void addUsers() {
//add dev users {systemId: 'a', authorizedUsers: ['user1', 'user2']}
}
@Profile("prod")
@ChangeSet(...)
public void addUsers() {
//add prod users {systemId: 'a', authorizedUsers: ['user1', 'user2']}
}
}
如果我没记错的话,我看到这个问题有两个部分
- 在哪里存储用户的 configuration/how 以将其传递给 Mongock
- 根据该配置,初始化您的 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
}
}
我正在使用 Mongock 初始化一个 MongoDb 数据库,其中包含一些配置,一组通过调用系统获得授权的用户。 {systemId: 'a', authorizedUsers: ['user1', user2]}
.
我的问题来自这样一个事实,即在开发中 user1 和 user2 被授权,但在 prod 中只有 user1 被授权。
- 添加一个 env 属性
{env: 'dev', systemId: 'a', authorizedUsers: ['user1', user2]}
并在我们搜索授权用户时将其用作过滤器是否更好?缺点是在数据库中有不同的配置可用,我们需要选择正确的配置。 - 或者在 Mongock 初始化函数(ChangeSet)中读取 Mongock 运行 所在的环境并初始化正确的数据是否更好?缺点是我们无法在正确的环境之前测试init的正确性
- 更好的解决方案?
提前感谢您的回复
编辑以澄清两个选项
- 选项 1
@ChangeLog
public class UsersChangeLogs {
@ChangeSet(...)
public void addUsers() {
//add dev users {env: 'dev', systemId: 'a', authorizedUsers: ['user1', 'user2']}
//add prod users {env: 'prod', systemId: 'a', authorizedUsers: ['user1', 'user2']}
}
}
和
@Service
class AuthorizedUsers {
@Value("env")
private String env;
List<User> getAuthorizedUsers() {
return db.users.filter(env)
}
}
- 方案二:(@Mongock团队提出)(已选择)
@ChangeLog
public class UsersChangeLogs {
@Profile("dev")
@ChangeSet(...)
public void addUsers() {
//add dev users {systemId: 'a', authorizedUsers: ['user1', 'user2']}
}
@Profile("prod")
@ChangeSet(...)
public void addUsers() {
//add prod users {systemId: 'a', authorizedUsers: ['user1', 'user2']}
}
}
如果我没记错的话,我看到这个问题有两个部分
- 在哪里存储用户的 configuration/how 以将其传递给 Mongock
- 根据该配置,初始化您的 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
}
}