У нас была проблема, связанная с дублированием данных в нашей базе данных, с полем даты, имеющим несколько значений, где мы должны были иметь 1. Я подумал, что добавлю способ решения проблемы для справки.
У нас есть коллекция под названием «данные» с числовым полем «значение» и полем «дата». У нас был процесс, который мы считали идемпотентным, но в итоге при втором запуске добавлялись два значения в день:
{ "_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")}
Нам нужна только одна из двух записей, поэтому пришлось прибегнуть к javascript для очистки базы данных. Наш первоначальный подход заключался в переборе результатов и удалении любого поля со временем между 6 и 11 часами утра (все дубликаты были утром), но во время реализации внесены изменения. Вот сценарий, используемый для его исправления:
var data = db.data.find({"type" : "x"})
var found = [];
while (data.hasNext()){
var datum = data.next();
var rdate = datum.date;
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;
}
}
а затем запустил его с mongo thedatabase fixer_script.js