เรามีปัญหาเกี่ยวกับข้อมูลที่ซ้ำกันในฐานข้อมูลของเราด้วยฟิลด์วันที่ที่มีค่าหลายค่าที่เราหมายถึงมี 1 ฉันคิดว่าฉันจะเพิ่มวิธีที่เราแก้ไขปัญหานี้เพื่อการอ้างอิง
เรามีชุดข้อมูลที่เรียกว่า "ข้อมูล" พร้อมฟิลด์ "ค่า" ตัวเลขและฟิลด์วันที่ "วันที่" เรามีกระบวนการที่เราคิดว่าเป็น idempotent แต่จบลงด้วยการเพิ่มค่า 2 x ต่อวันในการเรียกใช้ครั้งที่สอง:
{ "_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 ของเรคคอร์ดดังนั้นจึงต้องใช้จาวาสคริปต์เพื่อล้างฐานข้อมูล วิธีการเริ่มต้นของเราคือการทำซ้ำผลลัพธ์และลบฟิลด์ใด ๆ ด้วยเวลาระหว่าง 6.00 น. ถึง 11.00 น. (รายการที่ซ้ำกันทั้งหมดในตอนเช้า) แต่ในระหว่างการดำเนินการทำให้เกิดการเปลี่ยนแปลง นี่คือสคริปต์ที่ใช้ในการแก้ไข:
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