Алтернативен подход е да използвате aggregation framework
който има по-добра производителност от map-reduce. Разгледайте следния тръбопровод за агрегиране, който като първи етап от тръбопровода за агрегиране, $group
оператор групира документи по ID
поле и съхранява в unique_ids
поле всеки _id
стойност на групираните записи с помощта на $addToSet
оператор. $sum
операторът на акумулатора сумира стойностите на предадените му полета, в този случай константата 1 - като по този начин брои броя на групираните записи в полето за броене. Другата стъпка на конвейера $match
филтрира документи с брой поне 2, т.е. дубликати.
След като получите резултата от агрегирането, итерирате курсора, за да премахнете първия _id
в unique_ids
поле, след което натиснете останалите в масив, който ще се използва по-късно за премахване на дубликатите (минус един запис):
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}})