Trước tiên, bạn cần cập nhật tài liệu của mình và thay đổi difficultyrating
và beatmapset_id
thành số dấu phẩy động. Để làm điều đó, bạn cần lặp lại từng tài liệu bằng .forEach
và cập nhật từng tài liệu với "Bulk"
hoạt động để đạt hiệu quả tối đa ..
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();
}
Hiện tại và kể từ Cú pháp "dropDups" để tạo chỉ mục đã "không được chấp nhận" kể từ MongoDB 2.6 và bị loại bỏ trong MongoDB 3.0. Đây là cách bạn có thể loại bỏ các vi phạm.
Ý tưởng chính ở đây trước tiên là sắp xếp tài liệu của bạn theo difficultyrating
theo thứ tự giảm dần.
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();
}
câu trả lời này bao gồm chủ đề để biết thêm chi tiết.