MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

pymongo:Duplikate entfernen (Karte reduzieren?)

Ein alternativer Ansatz ist die Verwendung des aggregation framework was eine bessere Leistung als map-reduce hat. Betrachten Sie die folgende Aggregationspipeline, die als erste Stufe der Aggregationspipeline die $group Operator gruppiert Dokumente nach der ID Feld und speichert in den unique_ids Feld für jede _id Wert der gruppierten Datensätze mit dem $addToSet Operator. Der $sum Der Akkumulator-Operator addiert die Werte der ihm übergebenen Felder, in diesem Fall die Konstante 1, und zählt dadurch die Anzahl der gruppierten Datensätze in das Zählfeld. Der andere Pipeline-Schritt $match filtert Dokumente mit einer Anzahl von mindestens 2, d. h. Duplikaten.

Sobald Sie das Ergebnis der Aggregation erhalten haben, wiederholen Sie den Cursor, um die erste _id zu entfernen in den unique_ids Feld, dann schieben Sie den Rest in ein Array, das später verwendet wird, um die Duplikate zu entfernen (minus einem Eintrag):

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