sql >> Database >  >> NoSQL >> MongoDB

Snelste manier om dubbele documenten in mongodb te verwijderen

dropDups: true optie is niet beschikbaar in 3.0.

Ik heb een oplossing met een aggregatieraamwerk om duplicaten te verzamelen en vervolgens in één keer te verwijderen.

Het kan iets langzamer zijn dan de "index"-wijzigingen op systeemniveau. Maar het is goed om na te denken over de manier waarop u dubbele documenten wilt verwijderen.

a. Alle documenten in één keer verwijderen

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. U kunt documenten één voor één verwijderen.

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. Hoe werkt ServiceStack Redis bij het ophalen van gegevens?

  2. Hoe een document waarnaar wordt verwezen door een id in mongoDB uit php verwijderen?

  3. MapReduce met MongoDB echt, erg traag (30 uur versus 20 minuten in MySQL voor een vergelijkbare database)

  4. MongoDB:Hoe kom ik erachter of een arrayveld een element bevat?