MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Най-бързият начин за премахване на дублиращи се документи в mongodb

dropDups: true опцията не е налична в 3.0.

Имам решение с рамка за агрегиране за събиране на дубликати и след това премахване наведнъж.

Може да е малко по-бавно от промените в "индекса" на системно ниво. Но е добре да обмислите начина, по който искате да премахнете дублиращи се документи.

а. Премахнете всички документи наведнъж

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

б. Можете да изтривате документи един по един.

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Преобразувайте DBObject в POJO с помощта на MongoDB Java драйвер

  2. Как да актуализирате множество елементи на масив в mongodb

  3. Група драйвери на MongoDB .NET по времеви диапазон

  4. Импортиране на данни в екземпляр на MongoDB

  5. Най-добри практики за архивиране на бази данни