Veritabanımızda yinelenen verilerle ilgili bir sorun yaşadık, tarih alanı 1 olması gereken birden fazla değere sahipti. Sorunu referans için çözdüğümüz yolu ekleyeceğimi düşündüm.
Sayısal "değer" alanı ve tarih "tarih" alanı içeren "veri" adlı bir koleksiyonumuz var. İdempotent olduğunu düşündüğümüz bir süreç vardı, ancak ikinci çalışmada günde 2 x değer ekledik:
{ "_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")}
Biz sadece 2 kayıtları 1 gerekir, bu yüzden db temizlemek için javascript başvurmak zorunda kaldı. İlk yaklaşımımız, sonuçları yinelemek ve 06: 00-11: 00 saatleri arasında (tüm kopyalar sabah idi) herhangi bir alanı kaldırmak olacaktı, ancak uygulama sırasında bir değişiklik yaptı. Düzeltmek için kullanılan komut dosyası şöyledir:
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;
}
}
ve sonra ile koştu mongo thedatabase fixer_script.js