sql >> Databasteknik >  >> NoSQL >> MongoDB

Snabbaste sättet att ta bort dubbletter av dokument i mongodb

dropDups: true alternativet är inte tillgängligt i 3.0.

Jag har en lösning med aggregeringsramverk för att samla in dubbletter och sedan ta bort dem på en gång.

Det kan vara något långsammare än "index" på systemnivå. Men det är bra genom att överväga hur du vill ta bort dubbletter av dokument.

a. Ta bort alla dokument på en gång

var duplicates = [];

db.collectionName.aggregate([
  { $match: { 
    name: { "$ne": '' }  // discard selection criteria
  }},
  { $group: { 
    _id: { name: "$name"}, // can be grouped on multiple properties 
    dups: { "$addToSet": "$_id" }, 
    count: { "$sum": 1 } 
  }},
  { $match: { 
    count: { "$gt": 1 }    // Duplicates considered as count greater than one
  }}
],
{allowDiskUse: true}       // For faster processing if set is larger
)               // You can display result until this and check duplicates 
.forEach(function(doc) {
    doc.dups.shift();      // First element skipped for deleting
    doc.dups.forEach( function(dupId){ 
        duplicates.push(dupId);   // Getting all duplicate ids
        }
    )
})

// If you want to Check all "_id" which you are deleting else print statement not needed
printjson(duplicates);     

// Remove all duplicates in one go    
db.collectionName.remove({_id:{$in:duplicates}})  

b. Du kan ta bort dokument ett efter ett.

db.collectionName.aggregate([
  // discard selection criteria, You can remove "$match" section if you want
  { $match: { 
    source_references.key: { "$ne": '' }  
  }},
  { $group: { 
    _id: { source_references.key: "$source_references.key"}, // can be grouped on multiple properties 
    dups: { "$addToSet": "$_id" }, 
    count: { "$sum": 1 } 
  }}, 
  { $match: { 
    count: { "$gt": 1 }    // Duplicates considered as count greater than one
  }}
],
{allowDiskUse: true}       // For faster processing if set is larger
)               // You can display result until this and check duplicates 
.forEach(function(doc) {
    doc.dups.shift();      // First element skipped for deleting
    db.collectionName.remove({_id : {$in: doc.dups }});  // Delete remaining duplicates
})


  1. Hur man använder MongoRegex (MongoDB C#-drivrutin)

  2. Hur kan jag inaktivera MongoDB-loggmeddelanden i konsolen?

  3. render_template med flera variabler

  4. Hur konfigurerar man Node Redis-klienten för att skicka fel omedelbart när anslutningen har misslyckats? [LÄS INFORMATION]