如何安静地定制现有的MongoDB?

时间:2015-05-12 08:49:27

标签: java mongodb morphia nosql

Supose我有一个运行的mongodb实例(也使用mongo分片),每秒有数百万个数据和数千个事务,我使用morphia作为我的对象文档mappe。 因为我们希望通过错误修复,更新和...来保持项目的活力,在某些时候,改变数据模型将是不可避免的。考虑下面的例子: 我有一个持久的类(模型):

private EventAsset{
    @Id
    private String id;
    @Constraints.Required
    private String time;
    private EventType eventType;
}

现在我们已经确定EventAsset.class应该更改为:

private EventAsset{
    @Id
    private String id;
    @Constraints.Required
    private String time;
    @Constraints.Required
    private String assetName;
}

正如您所看到的那样eventType已被删除,并且添加了必需assetName,此更改将阻止应用程序启动。我能想到的唯一可能的主要解决方案是

  • 创建一个新的数据库并将旧值插入其中,并将其中一些如何管理 以一种你不会伤害的方式在旧数据库和新数据库之间切换 每秒钟进行少量的交易。
  • 使用或创建一个分析课程并进行比较的工具 针对数据库并对现有数据库进行必要的更改 并且不会对现有数据造成损害并导致数据流量受损(很少 每秒一次的交易)

这种情况似乎是每个(或至少每隔几个月左右)每个实时项目的问题。那么这个问题有一个公认的解决方案吗?你有什么建议?

1 个答案:

答案 0 :(得分:1)

删除@Constraints.Required应该不是问题,添加新属性也没问题。您的应用无法启动,因为@Constraints.Required - 是否来自Play框架的注释?

我认为这个要求在关系数据库中几乎是一样的 - 添加一个新列,使其成为必需,并且它将不再起作用。

我会看到可能的解决方案:

  • 删除注释,仅对应用程序中的新写入强制执行该逻辑
  • 有一些清理应用程序可以为现有数据添加值(如果可能的话)。一旦所有条目都存在该值,就添加注释。
  • 如果必须,请使用多个数据存储 - 不确定这是否值得花费。并且至少使用Morphia 1.0.0-rc0,因为在单个应用程序中存在多个数据存储之前的错误。