MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie entferne ich Duplikate mit einer bestimmten Bedingung in Mongodb?

Zuerst müssen Sie Ihre Dokumente aktualisieren und difficultyrating ändern und beatmapset_id zur Fließkommazahl. Dazu müssen Sie jedes Dokument mit dem .forEach Methode und aktualisieren Sie jedes Dokument mit "Bulk" Operationen für maximale Effizienz..

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

Jetzt und seitdem Die „dropDups“-Syntax für die Indexerstellung wurde ab MongoDB 2.6 „veraltet“ und in MongoDB 3.0 entfernt. So können Sie Duplikate entfernen.

Die Hauptidee hier ist, zuerst Ihr Dokument nach difficultyrating zu sortieren in absteigender Reihenfolge.

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

Diese Antwort decken Sie das Thema für weitere Details ab.