2016-04-15 9 views
0

У меня есть сценарий, в котором список из 1000 сотрудников (пример ниже), где их баланс обновляется на каждом конце месяца, где баланс каждого сотрудника может быть другим.Весенние данные MongoDB, поддерживающие целостность данных в массовом обновлении

{ 
    _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

Идите своим первым подходом. Сделайте это один за другим. Вместо сохранения всего объекта используйте 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.

+0

Я согласился с вашим вторым моментом относительно масштабируемости. Проблема с первым подходом заключается в том, что атомарные обновления гарантируют обновление только для одного документа или все равно будут работать нормально, если мне нужно обновить одинаковое значение баланса для нескольких объектов, однако, если разные сотрудники имеют разный баланс, мы не можем указывать их в одном запросе, приводит к выполнению нескольких запросов, тем самым отменяя гарантию атомарности. – tarunkumar

0

Еще один возможный подход, по которому мы окончательно остановились, состоит в том, чтобы сохранить нашу пользовательскую контрольную точку в монго для отката или совершить все необходимое (поскольку размер наших данных невелик, говорят только 1000 сотрудников), мы сначала создаем документ со старым и новым для всех сотрудников и сохраните его перед запуском массового обновления. Если первая вставка записи прошла успешно, у нас есть, по крайней мере, состояние БД, к которому мы можем откатиться или попытаться повторно выполнить массовое обновление в случае сбоев.

Если процесс массового обновления завершен с успехом, мы отбрасываем коллекцию контрольных точек, а в случае сбоя мы повторно запускаем обновления для всех записей, где новое значение не соответствует записи сотрудников.

Однако, если ваша конструкция позволяет, лучше перейти на гибридную БД, в которой сохранять транзакционные данные в некоторой реляционной БД и для отдыха полагаться на монго.

Смежные вопросы