Un enfoque alternativo es usar el aggregation framework
que tiene un mejor rendimiento que map-reduce. Considere la siguiente canalización de agregación que, como primera etapa de la canalización de agregación, $group
el operador agrupa los documentos por el ID
y se almacena en unique_ids
campo cada _id
valor de los registros agrupados usando el $addToSet
operador. El $sum
El operador acumulador suma los valores de los campos que se le pasan, en este caso la constante 1, contando así el número de registros agrupados en el campo de conteo. El otro paso de canalización $match
filtra documentos con un recuento de al menos 2, es decir, duplicados.
Una vez que obtenga el resultado de la agregación, itere el cursor para eliminar el primer _id
en los unique_ids
campo, luego inserte el resto en una matriz que se usará más tarde para eliminar los duplicados (menos una entrada):
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}})