सबसे पहले आपको अपने दस्तावेज़ों को अपडेट करना होगा और 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();
}
अब और चूंकि इंडेक्स निर्माण के लिए "ड्रॉपडुप्स" सिंटैक्स को मोंगोडीबी 2.6 के रूप में "बहिष्कृत" किया गया है और मोंगोडीबी 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();
}
यह उत्तर अधिक विस्तार के लिए विषय को कवर करें।