Une autre approche consiste à utiliser le aggregation framework
qui a de meilleures performances que map-reduce. Considérez le pipeline d'agrégation suivant qui, en tant que première étape du pipeline d'agrégation, le $group
l'opérateur regroupe les documents par ID
champ et stocke dans le unique_ids
champ chaque _id
valeur des enregistrements groupés à l'aide du $addToSet
opérateur. Le $sum
L'opérateur d'accumulateur additionne les valeurs des champs qui lui sont transmis, dans ce cas la constante 1 - comptant ainsi le nombre d'enregistrements groupés dans le champ de comptage. L'autre étape du pipeline $match
filtre les documents comptant au moins 2, c'est-à-dire les doublons.
Une fois que vous obtenez le résultat de l'agrégation, vous itérez le curseur pour supprimer le premier _id
dans les unique_ids
champ, puis poussez le reste dans un tableau qui sera utilisé plus tard pour supprimer les doublons (moins une entrée) :
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}})