Ein alternativer Ansatz ist die Verwendung des aggregation framework
was eine bessere Leistung als map-reduce hat. Betrachten Sie die folgende Aggregationspipeline, die als erste Stufe der Aggregationspipeline die $group
Operator gruppiert Dokumente nach der ID
Feld und speichert in den unique_ids
Feld für jede _id
Wert der gruppierten Datensätze mit dem $addToSet
Operator. Der $sum
Der Akkumulator-Operator addiert die Werte der ihm übergebenen Felder, in diesem Fall die Konstante 1, und zählt dadurch die Anzahl der gruppierten Datensätze in das Zählfeld. Der andere Pipeline-Schritt $match
filtert Dokumente mit einer Anzahl von mindestens 2, d. h. Duplikaten.
Sobald Sie das Ergebnis der Aggregation erhalten haben, wiederholen Sie den Cursor, um die erste _id
zu entfernen in den unique_ids
Feld, dann schieben Sie den Rest in ein Array, das später verwendet wird, um die Duplikate zu entfernen (minus einem Eintrag):
cursor = db.coll.aggregate(
[
{"$group": {"_id": "$ID", "unique_ids": {"$addToSet": "$_id"}, "count": {"$sum": 1}}},
{"$match": {"count": { "$gte": 2 }}}
]
)
response = []
for doc in cursor:
del doc["unique_ids"][0]
for id in doc["unique_ids"]:
response.append(id)
coll.remove({"_id": {"$in": response}})