Самый простой способ сделать это за один проход - отсортировать по md5 и затем обработать соответствующим образом.
Что-то вроде:
var previous_md5;
db.files.find( {"md5" : {$exists:true} }, {"md5" : 1} ).sort( { "md5" : 1} ).forEach( function(current) {
if(current.md5 == previous_md5){
db.duplicates.update( {"_id" : current.md5}, { "$inc" : {count:1} }, true);
}
previous_md5 = current.md5;
});
Этот маленький скрипт сортирует записи md5 и просматривает их по порядку. Если md5 повторяется, то они будут "вплотную" после сортировки. Поэтому мы просто сохраняем указатель на previous_md5
и сравниваем его current.md5
. Если мы найдем дубликат, я помещу его в коллекцию duplicates
(и использую $ inc для подсчета количества дубликатов).
Этот сценарий означает, что вам нужно выполнить цикл по первичному набору данных только один раз. Затем вы можете просмотреть коллекцию duplicates
и выполнить очистку.