MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

pymongo :supprimer les doublons (réduire la carte ?)

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}})