2014-10-03 46 views
1

我从sql DB获取信息并使用morphia将它们移动到mongo。我们检测到SQL方面的增量变化,并将更改后的值导入Monog,但是我的第一次尝试不起作用,因为我最终在数据库中使用了旧条目和新条目,而不是使用新条目折腾旧条目一。干净的方式强制morphia覆盖现有的条目

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

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

我目前的懒惰攻击是保存sqlid两次,一次是@id,一次是正常字段。它做我想要的,但仍然感觉hack-y(如果我说的话,这是一个词!)。

当你保存到mongo时,是不是有一些更简单的方法来指定一个字段,并说“覆盖,如果这个字段已经存在”?

回答

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的任何类型。如果有疑问,只需使用字符串,它应该工作。

+0

我可以使用sqlID作为mongo Id。我的问题是,如果它被标记为mongo Id,它会以不同的方式保存id。如果我为它添加一个mongo Id,就不会再创建一个sqlID字段,也不会有任何方法根据生成的mongo数据库中的sqlID进行读取操作。 – dsollen 2014-10-06 16:25:43