हमारे डेटाबेस में डुप्लिकेट किए गए डेटा से संबंधित एक समस्या थी, जिसमें एक दिनांक फ़ील्ड के साथ कई मान होते थे जहां हम 1 थे। मैंने सोचा कि मैं जिस तरह से हमने संदर्भ के लिए समस्या का समाधान किया है।
हमारे पास संख्यात्मक "मान" फ़ील्ड और "दिनांक" फ़ील्ड के साथ "डेटा" नामक एक संग्रह है। हमारे पास एक प्रक्रिया थी जिसके बारे में हमने सोचा था कि यह बेकार है, लेकिन प्रति सेकंड 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")}
हमें केवल 2 में से 1 रिकॉर्ड चाहिए, इसलिए 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