Chúng tôi đã có một vấn đề liên quan đến dữ liệu trùng lặp trong cơ sở dữ liệu của chúng tôi, với trường ngày có nhiều giá trị mà chúng tôi dự định có 1. Tôi nghĩ tôi đã thêm cách chúng tôi giải quyết vấn đề để tham khảo.
Chúng tôi có một bộ sưu tập gọi là "dữ liệu" với trường "giá trị" số và trường "ngày". Chúng tôi đã có một quy trình mà chúng tôi nghĩ là bình thường, nhưng cuối cùng đã thêm 2 x giá trị mỗi ngày vào lần chạy thứ hai:
{ "_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")}
Chúng tôi chỉ cần 1 trong 2 bản ghi, vì vậy phải sử dụng javascript để dọn sạch db. Cách tiếp cận ban đầu của chúng tôi sẽ là lặp đi lặp lại qua các kết quả và xóa bất kỳ trường nào có thời gian từ 6 giờ sáng đến 11 giờ sáng (tất cả các bản sao đều vào buổi sáng), nhưng trong quá trình thực hiện, đã thay đổi. Đây là đoạn script được sử dụng để sửa nó:
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;
}
}
và sau đó chạy nó với mongo thedatabase fixer_script.js