Pertama, Anda perlu memperbarui dokumen Anda dan mengubah difficultyrating
dan beatmapset_id
untuk nomor titik mengambang. Untuk melakukannya, Anda perlu mengulang setiap dokumen menggunakan .forEach
metode dan perbarui setiap dokumen dengan "Bulk"
operasi untuk efisiensi maksimum..
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();
}
Sekarang dan sejak Sintaks "dropDups" untuk pembuatan indeks telah "tidak digunakan lagi" pada MongoDB 2.6 dan dihapus di MongoDB 3.0. Ini adalah bagaimana Anda dapat menghapus dups.
Ide utama di sini adalah pertama-tama mengurutkan dokumen Anda dengan difficultyrating
dalam urutan menurun.
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();
}
jawaban ini membahas topik untuk lebih detail.