En alternativ tilgang er at bruge aggregationsramme
som har bedre ydeevne end map-reduce. Overvej følgende aggregeringspipeline, der som det første trin i aggregeringspipelinen, $gruppe
operatør grupperer dokumenter efter ID
felt og gemmer i unique_ids
felt hver _id
værdien af de grupperede poster ved hjælp af $sum
akkumulatoroperatoren summerer værdierne af de felter, der sendes til den, i dette tilfælde konstanten 1 - og tæller derved antallet af grupperede poster ind i tællefeltet. Det andet pipelinetrin $match
filtrerer dokumenter med et antal på mindst 2, dvs. dubletter.
Når du får resultatet fra aggregeringen, gentager du markøren for at fjerne det første _id
i unique_ids
feltet, og skub derefter resten ind i et array, der senere vil blive brugt til at fjerne dubletterne (minus én indtastning):
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}})