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

spring data MongoDB在批量更新中维护数据完整性,mongodb,spring-data,spring-data-mongodb,Mongodb,Spring Data,Spring Data Mongodb,我有一个场景,比如说1000名员工的名单(下面的样本),他们的余额在每个月末更新,每个员工的余额可能不同 { _id:1 name:"John" balance:40 }, 现在,执行相同操作的最佳实践是什么。一个接一个地表演 for (Employee employee : employeeList) { employee.update(); } 或 或者第三种方法可以是 Load all employee records. Insert employe

我有一个场景,比如说1000名员工的名单(下面的样本),他们的余额在每个月末更新,每个员工的余额可能不同

{
  _id:1
  name:"John"
  balance:40
},
现在,执行相同操作的最佳实践是什么。一个接一个地表演

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

或者第三种方法可以是

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).

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

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

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);

你的第二个和第三个将无法缩放。不建议在运行时删除收集。正在重命名的集合已被删除

我们最终确定的另一种可能的方法是在mongo中保存自定义检查点,以便回滚或提交任何必要的内容(因为我们的数据量很小,比如说只有1000名员工),我们首先为所有员工创建一个具有新旧状态的文档,并在开始批量更新之前先保存它。如果第一个记录插入成功,我们至少有一个DB状态,在失败的情况下,我们可以回滚到该状态或进一步尝试重新执行批量更新

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


然而,如果您的设计允许,最好使用混合数据库,在这种数据库中,事务数据保存在一些关系数据库中,而rest则依赖于mongo

我同意您关于可伸缩性的第二点。第一种方法的问题是,原子更新保证只对单个文档进行更新,或者如果我需要将相同的余额值更新到多个对象,原子更新仍然可以正常工作,但是如果不同的员工有不同的余额,我们不能在单个查询中指定它们,这会导致执行多个查询,从而取消对原子性的保证。
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);