Wir hatten ein Problem mit doppelten Daten in unserer Datenbank, mit einem Datumsfeld mit mehreren Werten, bei denen wir 1 haben sollten. Ich dachte, ich würde die Art und Weise hinzufügen, wie wir das Problem als Referenz gelöst haben.
Wir haben eine Sammlung namens "Daten" mit einem numerischen Feld "Wert" und einem Feld "Datum" Datum. Wir hatten einen Prozess, den wir für idempotent hielten, der jedoch beim zweiten Durchlauf 2 x Werte pro Tag hinzufügte:
{ "_id" : "1", "type":"x", "value":1.23, date : ISODate("2013-05-21T08:00:00Z")}
{ "_id" : "2", "type":"x", "value":1.23, date : ISODate("2013-05-21T17:00:00Z")}
Wir brauchen nur einen der beiden Datensätze, mussten also das Javascript verwenden, um die Datenbank zu bereinigen. Unser ursprünglicher Ansatz bestand darin, die Ergebnisse zu durchlaufen und alle Felder mit einer Zeit zwischen 6 und 11 Uhr zu entfernen (alle Duplikate waren am Morgen), aber während der Implementierung eine Änderung vorzunehmen. Hier ist das Skript, mit dem das Problem behoben wurde:
var data = db.data.find({"type" : "x"})
var found = [];
while (data.hasNext()){
var datum = data.next();
var rdate = datum.date;
// instead of the next set of conditions, we could have just used rdate.getHour() and checked if it was in the morning, but this approach was slightly better...
if (typeof found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] !== "undefined") {
if (datum.value != found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()]) {
print("DISCREPENCY!!!: " + datum._id + " for date " + datum.date);
}
else {
print("Removing " + datum._id);
db.data.remove({ "_id": datum._id});
}
}
else {
found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] = datum.value;
}
}
und dann lief es mit mongo thedatabase fixer_script.js