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

MongoDBから重複を削除する

    "dropDups" インデックス作成の構文は、MongoDB 2.6で「非推奨」になり、MongoDB3.0で削除されました。 「削除」は任意であり、「重複」は削除される可能性があるため、ほとんどの場合、これを使用することはあまり良い考えではありません。つまり、「削除」されるのは、本当に削除したいものではない可能性があります。

    とにかく、ここでのインデックスキーの値は許可されているよりも長くなるため、「インデックスの長さ」エラーが発生します。一般的に言って、通常のアプリケーションで43フィールドにインデックスを付けることは「意味がありません」。

    コレクションから「重複」を削除する場合は、集計クエリを実行して「重複」データが含まれているドキュメントを特定し、そのリストを循環して、すでに「一意」の「1つを除くすべて」を削除することをお勧めします。 code> _id ターゲットコレクションからの値。これは、最大の効率を得るために「一括」操作で実行できます。

    :あなたのドキュメントに実際に43の「一意の」フィールドが含まれているとは信じがたいです。 「必要なものはすべて」 単にのみを識別することです ドキュメントを「一意」にし、以下に概説するプロセスに従うフィールド:

    var bulk = db.testkdd.initializeOrderedBulkOp(),
        count = 0;
    
    // List "all" fields that make a document "unique" in the `_id`
    // I am only listing some for example purposes to follow
    db.testkdd.aggregate([
        { "$group": {
            "_id": {
               "duration" : "$duration",
              "protocol_type": "$protocol_type", 
              "service": "$service",
              "flag": "$flag"
            },
            "ids": { "$push": "$_id" },
            "count": { "$sum": 1 }
        }},
        { "$match": { "count": { "$gt": 1 } } }
    ],{ "allowDiskUse": true}).forEach(function(doc) {
        doc.ids.shift();     // remove first match
        bulk.find({ "_id": { "$in": doc.ids } }).remove();  // removes all $in list
        count++;
    
        // Execute 1 in 1000 and re-init
        if ( count % 1000 == 0 ) {
           bulk.execute();
           bulk = db.testkdd.initializeOrderedBulkOp();
        }
    });
    
    if ( count % 1000 != 0 ) 
        bulk.execute();
    

    2.6より「低い」バージョンのMongoDBがあり、一括操作がない場合は、標準の .remove()で試すことができます。 ループ内にも。 .aggregate()にも注意してください ここにカーソルは返されません。ループは次のように変更する必要があります:

    db.testkdd.aggregate([
       // pipeline as above
    ]).result.forEach(function(doc) {
        doc.ids.shift();  
        db.testkdd.remove({ "_id": { "$in": doc.ids } });
    });
    

    ただし、ドキュメントを注意深く確認し、グループ化 _idの一部であると予想される「一意の」フィールドのみを含めるようにしてください。 。そうしないと、重複がないため、何も削除されなくなります。




    1. nodejsとredis-nodeを使用した非同期プログラミングパラダイム

    2. MongoDB $ anyElementTrue

    3. リリース1.1以降のImpalaの次のステップ

    4. BSONタイプObjectIdをJSONに変換する(Mongodbに保存)-Java