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