2015-11-02 2 views
5

मेरे पास "mongodb colllenctions" है और मैं इसके द्वारा कुंजी के साथ "खाली तार" को हटाना चाहता हूं।मैं mongodb संग्रह से खाली स्ट्रिंग को कैसे हटा सकता हूं?

इस से:

{ 
    "_id" : ObjectId("56323d975134a77adac312c5"), 
    "year" : "15", 
    "year_comment" : "", 
} 
{ 
    "_id" : ObjectId("56323d975134a77adac312c5"), 
    "year" : "", 
    "year_comment" : "asd", 
} 

मैं इस परिणाम हासिल करने के लिए करना चाहते हैं:

{ 
    "_id" : ObjectId("56323d975134a77adac312c5"), 
    "year" : "15", 
} 
{ 
    "_id" : ObjectId("56323d975134a77adac312c5"), 
    "year_comment" : "asd", 
} 

मैं इसे कैसे हल कर सकते थे?

उत्तर

2

मोंगो खोल में निम्नलिखित कोड का टुकड़ा है जो खाली या शून्य मान

var result=new Array(); 
db.getCollection('test').find({}).forEach(function(data) 
{ 
    for(var i in data) 
    { 
     if(data[i]==null || data[i]=='') 
     { 
     delete data[i] 
     } 
    } 
    result.push(data) 

}) 

print(tojson(result)) 
+0

यह केवल पहली पंक्ति से रिक्त आइटम हटा देता है, लेकिन बाकी में वे स्थान हैं। मैं अभी भी यह पता लगाने की कोशिश कर रहा हूं कि समस्या क्या है। खोल यह लिखता है: [ऑब्जेक्ट ऑब्जेक्ट], [ऑब्जेक्ट ऑब्जेक्ट], [ऑब्जेक्ट ऑब्जेक्ट] ... –

+0

इस फ़ंक्शन के साथ काम करता है: प्रिंट (tojson (परिणाम)); समस्या सुलझ गयी। –

+0

@FerencStraub उपरोक्त कोड स्निपेट परिणाम –

3

संग्रह में सभी चाबियों की एक अलग सूची प्राप्त करने के साथ शुरू होगा, उन कुंजी का उपयोग अपने क्वेरी आधार के रूप में करें और थोक 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(); 
    } 
}) 
+1

का जवाब देने के लिए धन्यवाद: खाली पैरामीटर या आप पैरामीटर द्वारा पैरामीटर करने के लिए पसंद करते हैं, आप मोंगो updateMany कार्यक्षमता का उपयोग कर सकते हैं। –

+0

@FerencStraub कोई चिंता नहीं, मदद करने में प्रसन्न :) – chridam

0

साथ क्षेत्रों स्ट्रिप्स आप एक ही अद्यतन करना चाहते हैं को क्रियान्वित करने का प्रयास करें

db.comments.updateMany({year: ""}, { $unset : { year : 1 }}) 
संबंधित मुद्दे