sql >> Base de Datos >  >> NoSQL >> MongoDB

pymongo:eliminar duplicados (mapa reducir?)

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}})