我有一个场景,其中说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).
或者是他们的任何其他方式,可以保证数据库数据完整性的最大成功机会,以及从性能角度来看也是如此。
答案 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。