Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
代码升级之间的Mongo db和java数据版本控制_Java_Mongodb_Object_Versioning - Fatal编程技术网

代码升级之间的Mongo db和java数据版本控制

代码升级之间的Mongo db和java数据版本控制,java,mongodb,object,versioning,Java,Mongodb,Object,Versioning,我有一个在线服务,运行多个应用程序服务器,其中有几个集合存储在MongoDB中。我以持续部署的方式工作,这基本上意味着如果一切顺利,代码更新会触发自动测试,然后进行生产升级(这会使问题变得有点复杂,但我相信这个问题也与非CD部署相关) 这在大多数情况下都是有效的,但有时我的一个(或多个)核心数据模型会发生变化,在这种情况下,升级可能会破坏内存中的数据,之后还会破坏数据库中的数据 我举个例子: 假设我有一个简单的数据对象: public class User { private Strin

我有一个在线服务,运行多个应用程序服务器,其中有几个集合存储在MongoDB中。我以持续部署的方式工作,这基本上意味着如果一切顺利,代码更新会触发自动测试,然后进行生产升级(这会使问题变得有点复杂,但我相信这个问题也与非CD部署相关)

这在大多数情况下都是有效的,但有时我的一个(或多个)核心数据模型会发生变化,在这种情况下,升级可能会破坏内存中的数据,之后还会破坏数据库中的数据

我举个例子:

假设我有一个简单的数据对象:

public class User {
    private String id;
    private String name;
    private String[] friendsNames;
}
现在我决定将用户更改为:

public class User {
    private String id;
    private String name;
}
并将好友添加为一个单独的集合,其中存储一个简单对象,例如:

public class Friend {
    private String name;
    private String friendUserId;
}
这导致了一个问题。在我更改数据结构以适应新的数据模型之前,我不能升级我的服务,在我关闭服务之前,我也不能更改数据,否则旧版本将读取新的数据版本并将其弄乱

因此,唯一的解决方案是关闭所有内容,在db上运行一些升级过程来更改所有内容,然后在运行新代码的情况下恢复服务

最后一个问题是:我想知道是否有一个版本数据的最佳实践解决方案(如果相关的话,特别是Mongo),以便旧版本应用程序能够继续使用旧数据,而新应用程序能够“看到”新数据。我认为像“UserV1.1”和“UserV1.2”这样的类版本可以在mongo中搜索合适的类版本,但如果有人已经仔细考虑并提出了一个智能解决方案,我不想“重新发明轮子”

说清楚一点,我不关心对象历史记录,我只是希望能够顺利升级应用程序版本。

欢迎来到“无模式”的乐趣。在我的应用程序中,我最终对对象进行了编码,使它们能够经历一个“过渡”时期。也就是说,任何更改模型的版本都必须支持旧的和新的“模式”。我把这些东西投入生产,然后开始一个漫长的过程,把所有的东西都转换过来。在下一个版本中,我们放弃了过渡逻辑。这是一个痛苦的屁股,但它的工作。更改模式需要两个版本