干净的方式强制morphia覆盖现有的条目

时间:2014-10-03 19:09:18

标签: java mongodb morphia

我从sql DB获取信息并使用morphia将它们移动到mongo中。我们检测SQL端的delta变化并将更改的值导入Monog,但是我的第一次尝试不起作用,因为我最终在数据库中同时使用旧条目和新条目,而不是使用新条目抛出旧条目之一。

我的下一个approch是取'sqlID'字段并用@id标记它。这样做了我想要的,但它也阻止了sqlid被添加为普通字段。当我想查询mongo的sqlID时,查询不再有效。

我发现的其他建议是对mongo进行查询以获取当前可以保存的@id,并编写一个自定义查询,覆盖现有表中的每个字段(如果存在)。我不喜欢前一个选项,因为它需要对我从sql中提取的每一行进行额外的mongo查询,而我使用的数据量太贵了。后者可以工作,但考虑到单个记录中有多少个字段,我真的不想手动写出一个查询来手动覆盖每个字段。

我目前懒惰的黑客是两次保存sqlID,一次是@id,一次是普通字段。它做我想要的,但仍然感觉hack-y(如果我说它是一个词!)。

当您保存到mongo时,是否有更简单的方法来指定字段并说“如果此字段已存在则覆盖”?

1 个答案:

答案 0 :(得分:0)

我只需在我的morphia模型中创建一个专门的构造函数,它将DB对象作为参数并在那里进行映射,例如。

public MyModel(WhatEverDbObject rdbmsEntity){
  this.idField = rdbmsEntity.sqlId;
  // set the other fields as required
}

接下来,您可以从RDBMS迭代更改的实体,只需将RDBMS实体传递给构造函数即可为MongoDB创建实体。保存它们应该像执行updateFirst with createIfMissing set to true一样简单,并在@Id字段上查询。

我无法理解为什么不能将你的sqlID用作@Id。请检查您的sqlId是否可以转换为您用于@Id的任何类型。如果有疑问,只需使用String就可以了。