2016-04-15 7 views
0

Ich habe ein Szenario, wo die Liste der sagen 1000 Mitarbeiter (Beispiel unten), wo ihr Kontostand an jedem Monat Ende aktualisiert wird, wo das Gleichgewicht der einzelnen Mitarbeiter unterschiedlich sein kann.Feder Daten MongoDB Aufrechterhaltung der Datenintegrität in Bulk-Update

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

Nun, was wäre die bestmögliche Praxis, um dasselbe zu tun. Durchführen sie eins nach dem anderen

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

oder

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

oder dritte Ansatz könnte

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

sein oder ist ihr eine andere Möglichkeit, die maximale Erfolgschancen der Datenbank Datenintegrität garantieren können auch gut aus Leistungsperspektive.

Antwort

0

Gehen Sie mit Ihrem ersten Ansatz. Mach es eins nach dem anderen. Anstatt das gesamte Objekt zu speichern, verwenden Sie atomic updates, was eine bessere Leistung bringt.

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

Ihre zweite und dritte wird nicht skalieren. Das Löschen der Sammlung zur Laufzeit ist nicht ratsam. Die Umbenennungssammlung hat limitations.

+0

Ich stimmte Ihrem zweiten Punkt hinsichtlich der Skalierbarkeit zu. Das Problem mit dem ersten Ansatz besteht darin, dass atomare Updates die Aktualisierung nur für ein einzelnes Dokument garantieren, oder noch funktionieren würde, wenn ich den gleichen Wert des Saldos für mehrere Objekte aktualisieren muss. Wenn jedoch unterschiedliche Mitarbeiter unterschiedliche Saldos haben, können wir sie nicht in einer einzelnen Abfrage angeben führt zur Ausführung mehrerer Abfragen, wodurch die Atomaritätsgarantie aufgehoben wird. – tarunkumar

0

Ein anderer möglicher Ansatz, auf den wir uns schließlich geeinigt haben, ist unseren benutzerdefinierten Prüfpunkt in mongo für Rollback zu speichern oder alles Notwendige zu committen (da unsere Datengröße klein ist, sagen 1000 Mitarbeiter), erstellen wir zuerst ein Dokument mit alt und neu Status für alle Mitarbeiter und speichern Sie sie zuerst, bevor Sie das Massenupdate starten. Wenn die erste Datensatzeinfügung erfolgreich ist, haben wir mindestens den Status der DB, zu dem wir einen Rollback durchführen können oder versuchen, die Massenaktualisierung im Falle eines Fehlers erneut auszuführen.

Wenn der Massenaktualisierungsprozess erfolgreich abgeschlossen wurde, löschen wir unsere Checkpoint-Sammlung. Im Falle eines Fehlers führen wir die Aktualisierungen für alle Datensätze erneut durch, bei denen der neue Wert nicht mit dem Mitarbeiterdatensatz übereinstimmt.

Allerdings, wenn Ihr Design erlaubt, besser für Hybrid-DB gehen, in dem Transaktionsdaten in einigen relationalen DB speichern und für den Rest über Mongo.

Verwandte Themen