Alternativním přístupem je použití aggregation framework
který má lepší výkon než map-reduce. Zvažte následující agregační kanál, který jako první fázi agregačního kanálu, $group
operátor seskupuje dokumenty podle ID
pole a uloží se do unique_ids
každé pole _id
hodnotu seskupených záznamů pomocí $addToSet
operátor. $sum
operátor akumulátoru sečte hodnoty polí, které mu byly předány, v tomto případě konstantu 1 - čímž započítá počet seskupených záznamů do pole počet. Druhý krok kanálu $match
filtruje dokumenty s počtem alespoň 2, tedy duplikáty.
Jakmile získáte výsledek z agregace, iterujete kurzorem, abyste odstranili první _id
v unique_ids
pole, poté vložte zbytek do pole, které bude později použito k odstranění duplikátů (mínus jeden záznam):
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}})