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

mongodbで特定の条件の重複を削除するにはどうすればよいですか?

    まず、ドキュメントを更新し、difficultyratingを変更する必要があります およびbeatmapset_id 浮動小数点数に。これを行うには、 .forEach メソッドを作成し、各ドキュメントを"Bulk" で更新します。 最大の効率のための操作..

    var bulk = db.collection.initializeOrderedBulkOp();
    var count = 0;
    db.collection.find().forEach(function(doc) { 
        bulk.find({ '_id': doc._id }).update({ 
            '$set': { 
                'beatmapset_id': parseFloat(doc.beatmapset_id), 
                'difficultyrating': parseFloat(doc.difficultyrating) 
            } 
        });
        count++; 
        if(count % 100 == 0) {     
            bulk.execute();     
            bulk = db.collection.initializeOrderedBulkOp(); 
        } 
    })
    
    if(count > 0) { 
        bulk.execute(); 
    }
    

    インデックス作成の「dropDups」構文は、MongoDB 2.6で「非推奨」になり、MongoDB3.0で削除されました。これが、重複を削除する方法です。

    ここでの主なアイデアは、最初にdifficultyratingでドキュメントを並べ替えることです。 降順。

    bulk  = db.collection.initializeUnorderedBulkOp();
    count = 0;
    db.collection.aggregate([
        { '$sort': { 'difficultyrating': -1 }}, 
        { '$group': { '_id': '$beatmapset_id', 'ids': { '$push': '$_id' }, 'count': { '$sum': 1 }}}, 
        { '$match': { 'count': { '$gt': 1 }}}
    ]).forEach(function(doc) {
        doc.ids.shift();
        bulk.find({'_id': { '$in': doc.ids }}).remove(); 
        count++; 
        if(count === 100) { 
            bulk.execute(); 
            bulk = db.collection.initializeUnorderedBulkOp();
        }
    })
    
    if(count !== 0) { 
        bulk.execute(); 
    }
    

    この回答 詳細については、トピックをカバーしてください。



    1. 失敗:アーカイブに収集する意図がありません

    2. _idでドキュメントを取得するにはどうすればよいですか?

    3. MongoDBシェルで調整可能なカーソルを作成するにはどうすればよいですか?

    4. MongoDb C#ドライバーのSample()を使用するのが難しい