Първо трябва да актуализирате документите си и да промените difficultyrating
и beatmapset_id
към число с плаваща запетая. За да направите това, трябва да преминете през всеки документ с помощта на .forEach
метод и актуализирайте всеки документ с "Групово"
операции за максимална ефективност..
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();
}
Сега и оттогава Синтаксисът „dropDups“ за създаване на индекс е „отхвърлен“ от MongoDB 2.6 и премахнат в MongoDB 3.0. Ето как можете да премахнете дублиранията.
Основната идея тук е първо да сортирате документа си по difficultyrating
в низходящ ред.
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();
}
Този отговор разгледайте темата за повече подробности.