sql >> Databáze >  >> NoSQL >> MongoDB

Jak odstranit duplikáty s určitou podmínkou v mongodb?

Nejprve musíte aktualizovat své dokumenty a změnit difficultyrating a beatmapset_id k číslu s plovoucí desetinnou čárkou. Chcete-li to provést, musíte procházet každý dokument pomocí .forEach a každý dokument aktualizujte pomocí "Hromadné" operace pro maximální efektivitu..

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

Nyní a od té doby Syntaxe "dropDups" pro vytváření indexu byla "zastarána" od MongoDB 2.6 a odstraněna v MongoDB 3.0. Takto můžete odstranit dupy.

Hlavní myšlenkou je nejprve seřadit dokument podle difficultyrating v sestupném pořadí.

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

Tato odpověď pokrýt téma pro více podrobností.



  1. Jak exportovat data mongoDB do formátu CSV?

  2. Mongoose upsert nevytváří výchozí vlastnost schématu

  3. Jak mohu určit segment GridFS?

  4. Aktualizujte pole tam, kde existuje, nebo vložte novou položku pole