sql >> データベース >  >> NoSQL >> MongoDB

mongodbで重複するドキュメントを削除する最速の方法

    dropDups: true オプションは3.0では使用できません。

    重複を収集して一度に削除するための集約フレームワークを備えたソリューションがあります。

    システムレベルの「インデックス」の変更よりも多少遅い場合があります。ただし、重複するドキュメントを削除する方法を検討することをお勧めします。

    a。一度にすべてのドキュメントを削除する

    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。ドキュメントを1つずつ削除できます。

    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. 文字列の「Like」に対するMongoDBC#クエリ

    2. セキュリティのためのアーキテクチャ:MongoDBのガイド

    3. $cond内に$existsを使用した条件付きグループ化

    4. SpringデータMongoDb:MappingMongoConverter remove _class