Ett alternativt tillvägagångssätt är att använda aggregationsramverket
som har bättre prestanda än map-reduce. Betrakta följande aggregeringspipeline som är det första steget i aggregeringspipelinen, $grupp
operatör grupperar dokument efter ID
och lagrar i unique_ids
fält varje _id
värdet för de grupperade posterna med $sum
ackumulatoroperatören summerar värdena för de fält som skickas till den, i detta fall konstanten 1 - och räknar därmed antalet grupperade poster i räknefältet. Det andra pipelinesteget $match
filtrerar dokument med ett antal på minst 2, det vill säga dubbletter.
När du får resultatet från aggregeringen, upprepar du markören för att ta bort det första _id
i unique_ids
fältet, tryck sedan in resten i en array som kommer att användas senare för att ta bort dubbletterna (minus en post):
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}})