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.