MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment supprimer les doublons avec une certaine condition dans mongodb ?

Vous devez d'abord mettre à jour vos documents et modifier difficultyrating et beatmapset_id au nombre à virgule flottante. Pour ce faire, vous devez parcourir chaque document en utilisant .forEach méthode et mettre à jour chaque document avec "Bulk" opérations pour une efficacité maximale..

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

Maintenant et depuis La syntaxe "dropDups" pour la création d'index a été "obsolète" à partir de MongoDB 2.6 et supprimée dans MongoDB 3.0. Voici comment vous pouvez supprimer les doublons.

L'idée principale ici est d'abord de trier votre document par difficultyrating par ordre décroissant.

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

Cette réponse couvrir le sujet pour plus de détails.