2013-07-08 6 views
8

मैं node.js और mongodb के लिए नया हूं और मुझे निम्न समस्या है: मुझे अपने mongodb से node.js फ़ाइल से सभी संग्रह ड्रॉप करने की आवश्यकता है। मैं इस तरह के एक समारोह है:mongodb और node.js के माध्यम से सभी संग्रह कैसे छोड़ें?

service.dropCollections = function(db, colls){ 
    for(var i = 0; i < colls.length; i++){ 
    var name = colls[i].name; 
    db.dropCollection(name, function(err) { 
     if(!err) { 
      console.log(name + " dropped"); 
     } else { 
      console.log("!ERROR! " + err.errmsg); 
     } 
    }); 
    } 
} 

और मैं निम्नलिखित समारोह में यह उपयोग कर रहा हूँ:

service.clearDB = function() { 
var MongoClient = require('mongodb').MongoClient 
, format = require('util').format;  

    MongoClient.connect('mongodb://127.0.0.1:27017/shiny_d', function(err, db){ 
    if(err) throw err; 
    db.collectionNames(function(err, collections){ 
     if(!err){ 
      service.dropCollections(db, collections); 
     } else { 
      console.log("!ERROR! "+ err.errmsg); 
     } 
     service.showCollections(); 
    }); 
    }); 
} 

एक आउटपुट के रूप में मैं

है त्रुटि! नहीं मिला एन एस

shiny_db.physicalinfos

पता नहीं क्या अभी क्या करना है। मैं आपकी मदद के लिए बहुत आभारी रहूंगा।

+0

'सिस्टम' से शुरू होने वाली किसी भी चीज को न हटाएं क्योंकि मोंगोडीबी द्वारा उपयोग के लिए आरक्षित हैं। – WiredPrairie

+0

क्या आप मुझसे बचने के लिए मुझे बता सकते हैं? –

+0

बस यह देखने के लिए जांचें कि स्ट्रिंग 'system' से शुरू होती है या नहीं। – WiredPrairie

उत्तर

3

मैं एक जवाब मिला की तरह संग्रह में ऑब्जेक्ट की श्रृंखला रिटर्न के साथ भ्रमित किया जा सकता है। सबसे पहले मैंने अपने कनेक्शन में गलती की है, यह निम्नलिखित की तरह होना चाहिए: 'mongodb://127.0.0.1:27017/shiny_db'। दूसरी गलती संग्रह के नाम पर थी। यह 'db_name.coll_name' जैसा था, यही कारण है कि db.dropCollection(name, callback) विशेष संग्रह नहीं मिला और इसके कारण मुझे ns not found गलती हुई थी। तो मैंने coll_name से db_name को अलग करने के लिए निम्नलिखित तंत्र का उपयोग किया है:

var name = colls[i].name.substring('shiny_db.'.length); और मैंने "सिस्टम" संग्रह की जांच जोड़ दी है।

अंतिम कोड ऐसा दिखाई देता है:

service.clearDB = function() { 
    var MongoClient = require('mongodb').MongoClient 
    , format = require('util').format;  

    MongoClient.connect('mongodb://localhost/shiny_db', function(err, db) { 
     if(err) throw err; 
     db.collectionNames(function(err, collections){ 
      if(!err){ 
       service.dropCollections(db, collections);     
      } else { 
       console.log("!ERROR! "+ err.errmsg); 
      } 
     }); 
    }); 
} 
service.dropCollections = function(db, colls){ 
    for(var i = 0; i < colls.length; i++){ 
     var name = colls[i].name.substring('shiny_db.'.length); 

     if (name.substring(0, 6) !== "system") { 
      db.dropCollection(name, function(err) { 
       if(!err) { 
        console.log(name + " dropped"); 
       } else { 
        console.log("!ERROR! " + err.errmsg); 
       } 
      }); 
     } else { 
      console.log(name + " cannot be dropped because it's a system file"); 
     }  
    } 
} 

आशा है कि यह किसी को मदद मिलेगी!

7

क्या यह अधिक तेज़, आसान और कम त्रुटि प्रवण नहीं है यदि आप केवल संपूर्ण डेटाबेस छोड़ देते हैं?

db.dropDatabase(); 

मोंगो CLI, जब भी आप एक गैर-मौजूद DB का उपयोग से कम से कम, यह जल्द ही आप डेटा बनाने कायम हो जाएगा। यह सभी संग्रहों को छोड़ने जैसा ही है।

मैंने अभी तक अध्ययन करने के अलावा किसी भी चीज़ के लिए मोंगोडीबी की कोशिश नहीं की है, इसलिए मुझे अनुमतियों के बारे में बहुत कुछ पता नहीं है। तो, शायद पूरे डीबी को छोड़ने की एकमात्र समस्या आपके उपयोगकर्ताओं की अनुमति होगी जो खो जाएंगी (मुझे विश्वास है)।

यदि यह स्क्रिप्ट जिसे आप बनाने की कोशिश कर रहे हैं, उत्पादन के लिए नहीं है, तो आप डीबी छोड़ने के लिए जाने के लिए अच्छे हैं।

+0

अच्छी तरह से, यह मेरा लक्ष्य नहीं था;) –

0

listCollections आपको स्ट्रिंग के रूप में संग्रह नामों की एक सरणी देता है।

ऐसा लगता है कि यह कुछ है कि हो सकता है db.collections()

+0

लेकिन संग्रह नाम को परिभाषित करने के लिए क्या अंतर है? मुझे 'db.dropCollection (name, callback)' –

+0

में तर्क के रूप में उपयोग करने के लिए संग्रहों के नामों की आवश्यकता है, यदि यह आपको उस वस्तु को वापस देता है जिसे आपको नाम प्राप्त करने के लिए obj.name का उपयोग करने की आवश्यकता होती है। अगर यह आपको वापस नाम देता है, तो आपको name.name का उपयोग नहीं करना चाहिए। –

+0

ठीक है, मैंने जांच की है कि 'संग्रह नाम' क्या लौटाता है, और यह ऑब्जेक्ट के साथ एक संग्रह देता है, जिसमें फ़ील्ड "नाम" होता है। लेकिन आपका जवाब मुझे एक विचार लाता है जो सफल रहा, बहुत बहुत धन्यवाद! –

संबंधित मुद्दे