Een alternatieve benadering is het gebruik van het aggregation framework
die betere prestaties heeft dan kaartverkleining. Beschouw de volgende aggregatiepijplijn die als de eerste fase van de aggregatiepijplijn, de $group
operator groepeert documenten op ID
veld en slaat op in de unique_ids
veld elke _id
waarde van de gegroepeerde records met behulp van de $addToSet
exploitant. De $sum
accumulator-operator telt de waarden op van de velden die eraan zijn doorgegeven, in dit geval de constante 1 - en telt daarmee het aantal gegroepeerde records in het telveld. De andere pijplijnstap $match
filtert documenten met een telling van minimaal 2, d.w.z. duplicaten.
Zodra u het resultaat van de aggregatie krijgt, herhaalt u de cursor om de eerste _id
te verwijderen in de unique_ids
veld, duw dan de rest in een array die later zal worden gebruikt om de duplicaten te verwijderen (min één invoer):
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}})