У нашій базі даних виникла проблема, що стосується дублюваних даних, у полі дат є декілька значень, де ми мали мати 1. Я думав, що я додам спосіб вирішення проблеми для довідки.
У нас є колекція під назвою "дані" з числовим полем "значення" та полем дати "дата". У нас був процес, який ми вважали безсильним, але в результаті додавали 2 х значення на день під час другого запуску:
{ "_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")}
Нам потрібно лише 1 з 2 записів, тому довелося вдатися до javascript, щоб очистити db. Наш початковий підхід полягав у тому, щоб повторити результати та видалити будь-яке поле з часом між 6 ранку та 11 ранку (всі дублікати були вранці), але під час впровадження внесли зміни. Ось сценарій, який використовується для його виправлення:
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;
}
}
а потім запустив його mongo thedatabase fixer_script.js