sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan fjerner du dubletter med en bestemt tilstand i mongodb?

Først skal du opdatere dine dokumenter og ændre difficultyrating og beatmapset_id til flydende kommanummer. For at gøre det skal du gå over hvert dokument ved hjælp af .forEach metode og opdater hvert dokument med "Bulk" operationer for maksimal effektivitet..

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 og siden "dropDups"-syntaksen til indeksoprettelse er blevet "udfaset" fra og med MongoDB 2.6 og fjernet i MongoDB 3.0. Sådan kan du fjerne dup'erne.

Hovedideen her er først at sortere dit dokument efter difficultyrating i faldende rækkefølge.

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

Dette svar dække emnet for flere detaljer.



  1. Mongoose time out og kaster undtagelse

  2. Skift mellem JPA og Mongo i Spring Boot MVC-appen

  3. Hvordan forespørges et MongoDB indlejret dokument korrekt med python?

  4. Skal jeg returnere et array eller data én efter én i Mongoose