Nous avons eu un problème lié aux données dupliquées dans notre base de données, avec un champ de date ayant plusieurs valeurs là où nous étions censés avoir 1. J'ai pensé ajouter la façon dont nous avons résolu le problème pour référence.
Nous avons une collection appelée "data" avec un champ numérique "value" et un champ date "date". Nous avons eu un processus que nous pensions idempotent, mais nous avons fini par ajouter 2 x valeurs par jour lors de la deuxième exécution:
{ "_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")}
Nous n'avons besoin que de 1 des 2 enregistrements, nous avons donc dû recourir au javascript pour nettoyer la base de données. Notre approche initiale allait consister à parcourir les résultats et à supprimer tout champ avec un temps compris entre 6h et 11h (tous les doublons étaient le matin), mais lors de la mise en œuvre, nous avons fait un changement. Voici le script utilisé pour résoudre ce problème:
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;
}
}
et puis l'a couru avec mongo thedatabase fixer_script.js