sql >> Database >  >> NoSQL >> MongoDB

Hoe duplicaten met een bepaalde voorwaarde in mongodb te verwijderen?

Eerst moet u uw documenten bijwerken en difficultyrating wijzigen en beatmapset_id naar zwevend puntnummer. Om dat te doen, moet je elk document doorlopen met behulp van de .forEach methode en werk elk document bij met "Bulk" operaties voor maximale efficiëntie..

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

Nu en sinds De "dropDups"-syntaxis voor het maken van indexen is "verouderd" vanaf MongoDB 2.6 en verwijderd in MongoDB 3.0. Dit is hoe je de dups kunt verwijderen.

Het belangrijkste idee hier is om uw document eerst te sorteren op difficultyrating in aflopende volgorde.

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

Dit antwoord bedek het onderwerp voor meer details.



  1. converteer iso-datum naar tijdstempel in mongo-query

  2. Controleer of het veld bestaat met MongoDB

  3. Hoe werkt de $inc-modifier met gelijktijdige verzoeken in mongodb?

  4. Dubbele sleutelfout met mongodb 2dsphere unieke index