MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

pymongo:rimuovi i duplicati (ridurre la mappa?)

Un approccio alternativo consiste nell'utilizzare il aggregation framework che ha prestazioni migliori rispetto a map-reduce. Si consideri la seguente pipeline di aggregazione che, come prima fase della pipeline di aggregazione, è il $group l'operatore raggruppa i documenti per ID campo e memorizza nel unique_ids campo ogni _id valore dei record raggruppati utilizzando il $addToSet operatore. Il $sum l'operatore accumulatore somma i valori dei campi passati ad esso, in questo caso la costante 1 - contando così il numero di record raggruppati nel campo conteggio. L'altro passaggio della pipeline $match filtra i documenti con un conteggio di almeno 2, ovvero i duplicati.

Una volta ottenuto il risultato dall'aggregazione, scorrere il cursore per rimuovere il primo _id nel unique_ids campo, quindi inserisci il resto in un array che verrà utilizzato in seguito per rimuovere i duplicati (meno una voce):

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