pymongo: Duplikate entfernen (Karte verkleinern?)

Ich habe eine Datenbank mit mehreren Sammlungen (insgesamt ~ 15mil Dokumente) und Dokumente sehen so aus (vereinfacht):

{'Text': 'blabla', 'ID': 101}
{'Text': 'Whuppppyyy', 'ID': 102}
{'Text': 'Abrakadabraaa', 'ID': 103}
{'Text': 'olalalaal', 'ID': 104}
{'Text': 'test1234545', 'ID': 104}
{'Text': 'whapwhapwhap', 'ID': 104}

Sie haben alle ein eindeutiges _id-Feld, aber ich möchte Duplikate löschen, die sich auf ein anderes Feld (das externe ID-Feld) beziehen.

Zunächst habe ich einen sehr manuellen Ansatz mit Listen und anschließendem Löschen versucht, aber die DB scheint zu groß zu sein, dauert sehr lange und ist nicht praktisch.

Zweitens funktioniert das Folgende in aktuellen MongoDB-Versionen nicht mehr, obwohl es von irgendjemandem empfohlen wird.

db.collection.ensureIndex( { ID: 1 }, { unique: true, dropDups: true } )

So, jetzt versuche ich, eine Lösung zur Kartenreduzierung zu erstellen, aber ich weiß nicht wirklich, was ich tue und habe insbesondere Schwierigkeiten, mit einem anderen Feld (nicht der Datenbank-ID) Duplikate zu finden und zu löschen. Hier ist mein schlechter erster Ansatz (aus einer anderen Quelle übernommen):

map = Code("function(){ if(this.fieldName){emit(this.fieldName,1);}}")
reduce = Code("function(key,values) {return Array.sum(values);}")
res = coll.map_reduce(map,reduce,"my_results");

response = []
for doc in res.find():
    if(doc['value'] > 1):
        count = int(doc['value']) - 1
        docs = col.find({"fieldName":doc['ID']},{'ID':1}).limit(count)
        for i in docs:
            response.append(i['ID'])

coll.remove({"ID": {"$in": response}})

Jede Hilfe, um etwaige Duplikate im externen ID-Feld zu reduzieren (einen Eintrag hinterlassen), wäre sehr hilfreich;) Danke!

Antworten auf die Frage(4)

Ihre Antwort auf die Frage