संग्रह में सभी चाबियों की एक अलग सूची प्राप्त करने के साथ शुरू होगा, उन कुंजी का उपयोग अपने क्वेरी आधार के रूप में करें और थोक API संचालन का उपयोग करके ऑर्डर किए गए थोक अपडेट करें। अद्यतन विवरण फ़ील्ड को हटाने के लिए $unset
ऑपरेटर का उपयोग करता है।
Map-Reduce
के माध्यम से क्वेरी को इकट्ठा करने के लिए आपको अलग-अलग कुंजी सूची प्राप्त करने के लिए तंत्र संभव है। निम्नलिखित mapreduce आपरेशन _ id मान के रूप में सभी कुंजी के साथ एक अलग संग्रह से स्थापित हो जाएगा:
mr = db.runCommand({
"mapreduce": "my_collection",
"map" : function() {
for (var key in this) { emit(key, null); }
},
"reduce" : function(key, stuff) { return null; },
"out": "my_collection" + "_keys"
})
सभी गतिशील कुंजी की एक सूची प्राप्त करने के लिए, जिसके परिणामस्वरूप संग्रह पर अलग चलाएँ:
db[mr.result].distinct("_id")
// prints ["_id", "year", "year_comment", ...]
अब ऊपर दी गई सूची दी गई है, आप एक ऑब्जेक्ट बनाकर अपनी क्वेरी को इकट्ठा कर सकते हैं जिसमें इसकी गुण लूप के भीतर सेट हो जाएंगे। आम तौर पर आपकी क्वेरी इस संरचना होगा:
var keysList = ["_id", "year", "year_comment"];
var query = keysList.reduce(function(obj, k) {
var q = {};
q[k] = "";
obj["$or"].push(q);
return obj;
}, { "$or": [] });
printjson(query); // prints {"$or":[{"_id":""},{"year":""},{"year_comment":""}]}
फिर आप उपयोग कर सकते हैं Bulk API
ऊपर क्वेरी के साथ बेहतर प्रदर्शन के लिए आपके अपडेट को व्यवस्थित बनाने के तरीके के रूप (MongoDB 2.6 और इसके बाद के संस्करण के साथ उपलब्ध)। कुल मिलाकर, आप के रूप में काम कर रहे कुछ है करने के लिए सक्षम होना चाहिए:
var bulk = db.collection.initializeOrderedBulkOp(),
counter = 0,
query = {"$or":[{"_id":""},{"year":""},{"year_comment":""}]},
keysList = ["_id", "year", "year_comment"];
db.collection.find(query).forEach(function(doc){
var emptyKeys = keysList.filter(function(k) { // use filter to return an array of keys which have empty strings
return doc[k]==="";
}),
update = emptyKeys.reduce(function(obj, k) { // set the update object
obj[k] = "";
return obj;
}, { });
bulk.find({ "_id": doc._id }).updateOne({
"$unset": update // use the $unset operator to remove the fields
});
counter++;
if (counter % 1000 == 0) {
// Execute per 1000 operations and re-initialize every 1000 update statements
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
})
यह केवल पहली पंक्ति से रिक्त आइटम हटा देता है, लेकिन बाकी में वे स्थान हैं। मैं अभी भी यह पता लगाने की कोशिश कर रहा हूं कि समस्या क्या है। खोल यह लिखता है: [ऑब्जेक्ट ऑब्जेक्ट], [ऑब्जेक्ट ऑब्जेक्ट], [ऑब्जेक्ट ऑब्जेक्ट] ... –
इस फ़ंक्शन के साथ काम करता है: प्रिंट (tojson (परिणाम)); समस्या सुलझ गयी। –
@FerencStraub उपरोक्त कोड स्निपेट परिणाम –