spring数据MongoDB在批量更新中维护数据完整性

时间:2016-04-15 15:38:32

标签: mongodb spring-data spring-data-mongodb

我有一个场景,其中说1000名员工的名单(下面的示例),其中每个月的员工余额可以不同,每月更新余额。

{
  _id:1
  name:"John"
  balance:40
},

现在执行相同操作的最佳做​​法是什么。逐个执行

for (Employee employee : employeeList) {
        employee.update();
    }

dropAll employees where id in (All employees ids)
mongoOperations.insert(employeeList, Employee.class);

或第三种方法可能

Load all employee records.
Insert employee records to a new collection say employee_temp.
Drop old collection (employee).
Rename newly inserted collection as old one (employee).

或者是他们的任何其他方式,可以保证数据库数据完整性的最大成功机会,以及从性能角度来看也是如此。

2 个答案:

答案 0 :(得分:0)

采用第一种方法。一个接一个地做。而不是保存整个对象,而是使用性能更好的atomic updates

Query query = Query.query(Criteria.where("id").is(id));
Update update = Update.update("balance", balance);
mongoTemplate.findAndModify(query, update, FindAndModifyOptions.options().returnNew(true), Employee.class);

你的第二个和第三个不会扩展。不建议在运行时删除集合。重命名集合有limitations

答案 1 :(得分:0)

我们最终解决的另一种可能方法是将我们的自定义检查点保存在mongo中以进行回滚或提交任何必要的内容(因为我们的数据大小很小,只说1000名员工),我们首先创建一个包含新旧状态的文档对于所有员工,在开始批量更新之前先将其保存。如果第一个记录插入成功,我们至少具有可以回滚的DB状态,或者在出现故障时进一步尝试重新执行批量更新。

如果批量更新过程成功完成,我们将删除检查点集合,如果失败,我们会重新执行对新值与员工记录不匹配的所有记录的更新。

但是,如果您的设计允许,最好选择混合数据库,其中保存某些关系数据库中的事务数据和休息依赖于mongo。