MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak usunąć duplikaty z określonym warunkiem w mongodb?

Najpierw musisz zaktualizować swoje dokumenty i zmienić difficultyrating i beatmapset_id do liczby zmiennoprzecinkowej. Aby to zrobić, musisz przejrzeć każdy dokument za pomocą .forEach i zaktualizuj każdy dokument za pomocą "Bulk" operacje dla maksymalnej wydajności..

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

Od teraz Składnia „dropDups” do tworzenia indeksów została „przestarzała” w MongoDB 2.6 i usunięta w MongoDB 3.0. W ten sposób możesz usunąć oszustwa.

Główną ideą jest tutaj najpierw posortowanie dokumentu według difficultyrating w porządku malejącym.

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

Ta odpowiedź omówić temat, aby uzyskać więcej szczegółów.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Niestandardowa domena Heroku nie działa

  2. Kierowca Ruby Mongo:Jak szukać interwałów dat?

  3. Korzystanie ze sterownika MongoDB C#:opakowane czy nie opakowane?

  4. Mongodb foreach dla kolekcji zagnieżdżonej w celu aktualizacji/kopiowania dokumentów do innej kolekcji

  5. Konieczność wykonania .toArray(), aby uzyskać dane wyjściowe mongodb .find() dla nazwy klucza, a nie wartości