sql >> Databasteknik >  >> NoSQL >> MongoDB

pymongo:ta bort dubbletter (förminska kartan?)

Ett alternativt tillvägagångssätt är att använda aggregationsramverket som har bättre prestanda än map-reduce. Betrakta följande aggregeringspipeline som är det första steget i aggregeringspipelinen, $grupp operatör grupperar dokument efter ID och lagrar i unique_ids fält varje _id värdet för de grupperade posterna med $addToSet operatör. $sum ackumulatoroperatören summerar värdena för de fält som skickas till den, i detta fall konstanten 1 - och räknar därmed antalet grupperade poster i räknefältet. Det andra pipelinesteget $match filtrerar dokument med ett antal på minst 2, det vill säga dubbletter.

När du får resultatet från aggregeringen, upprepar du markören för att ta bort det första _id i unique_ids fältet, tryck sedan in resten i en array som kommer att användas senare för att ta bort dubbletterna (minus en post):

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


  1. Felsökning av mongo hittades inte och php_mongo.dll är inte ett win32-programfel

  2. Varför MongoDB olika frågeplaner visar olika nReturned värde?

  3. Mongoose automatisk ökning

  4. MongoDB Exempel operatörer