sql >> Databáze >  >> NoSQL >> MongoDB

Nejrychlejší způsob, jak odstranit duplicitní dokumenty v mongodb

dropDups: true možnost není k dispozici ve verzi 3.0.

Mám řešení s agregačním rámcem pro shromažďování duplikátů a jejich odstranění najednou.

Může být poněkud pomalejší než změny "indexu" na systémové úrovni. Ale je dobré zvážit způsob, jakým chcete odstranit duplicitní dokumenty.

A. Odstraňte všechny dokumenty najednou

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. Dokumenty můžete mazat jeden po druhém.

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. vlastní řazení mongoose/mongodb

  2. MongoDB:je bezpečné používat ID dokumentu na veřejnosti?

  3. Snižte dobu provádění úloh sidekiq

  4. Instalace Redis na CentOS 7