Vous devez d'abord mettre à jour vos documents et modifier difficultyrating
et beatmapset_id
au nombre à virgule flottante. Pour ce faire, vous devez parcourir chaque document en utilisant .forEach
méthode et mettre à jour chaque document avec "Bulk"
opérations pour une efficacité maximale..
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();
}
Maintenant et depuis La syntaxe "dropDups" pour la création d'index a été "obsolète" à partir de MongoDB 2.6 et supprimée dans MongoDB 3.0. Voici comment vous pouvez supprimer les doublons.
L'idée principale ici est d'abord de trier votre document par difficultyrating
par ordre décroissant.
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();
}
Cette réponse couvrir le sujet pour plus de détails.