Mongoose वाला डेटाबेस कैसे छोड़ें?


97

मैं Node.js और Mongoose में एक डेटाबेस निर्माण स्क्रिप्ट तैयार कर रहा हूं। यदि डेटाबेस पहले से मौजूद है, तो मैं कैसे जांच सकता हूं और यदि ऐसा है, तो इसे Mongoose का उपयोग करके हटाएं (हटाएं)?

मुझे इसे मोंगोज़ के साथ छोड़ने का कोई तरीका नहीं मिला।


जवाबों:


166

मानस से एक संग्रह छोड़ने के लिए कोई विधि नहीं है, सबसे अच्छा आप कर सकते हैं एक की सामग्री को हटा दें:

Model.remove({}, function(err) { 
   console.log('collection removed') 
});

लेकिन मोंगोडब देशी जावास्क्रिप्ट ड्राइवर तक पहुंचने का एक तरीका है, जिसका उपयोग इसके लिए किया जा सकता है

mongoose.connection.collections['collectionName'].drop( function(err) {
    console.log('collection dropped');
});

चेतावनी

इस मामले में कुछ भी गलत होने से पहले बैकअप लें!


2
जब मैं दूसरे विकल्प की कोशिश करता हूं तो मुझे "अपरिभाषित की संपत्ति 'संग्रह नहीं मिल सकता है"
यारन नोहे

1
चूँकि सभी संग्रह हैश mongoose.connection.collections में हैं, आप बस उन्हें सूचीबद्ध कर सकते हैं (mongoose.connection.collections में संग्रह) {mongoose.connection.collections [संग्रह] .drop} ...
smth

3
आपको एक टाइपो मिला है - फ़ंक्शन (इरेट) के बाद एक अतिरिक्त अल्पविराम ... होना चाहिए: mongoose.connection.collections ['collectionName']। drop (फ़ंक्शन (ग़लती) {कंसोल.लॉग ('संग्रह गिरा') ;});
arxpoetica

3
क्या मैं अकेला हूँ जो इस उत्तर को जान पाया कि कैसे एक डेटाबेस को छोड़ना है। यह एक डेटाबेस को छोड़ने के लिए अपने संग्रह को छोड़ने के लिए नहीं कह रहा है ..
जोसेफ पर्स

3
"मानस से संग्रह छोड़ने की कोई विधि नहीं है", सबसे पहले ओपी एक डेटाबेस को हटाना चाहता है, न कि एक टकराव, दूसरा नीचे @hellslam का उत्तर अच्छी तरह से काम करता है।
SCBuergel.eth

79

यदि कोई पहले से ही कनेक्शन पर मौजूद नहीं है, तो Mongoose एक डेटाबेस बनाएगा, इसलिए एक बार कनेक्शन बनाने के बाद, आप यह देख सकते हैं कि उसमें कुछ भी है या नहीं।

आप अपने से जुड़े किसी भी डेटाबेस को छोड़ सकते हैं:

var mongoose = require('mongoose');
/* Connect to the DB */
mongoose.connect('mongodb://localhost/mydatabase',function(){
    /* Drop the DB */
    mongoose.connection.db.dropDatabase();
});

1
मैंने कोशिश की, mongoose.connection.db.dropDatabase()लेकिन मैंने पाया db अभी भी है? क्या मुझे कुछ याद है?
Freewind

यदि आप बाद में इससे जुड़े हैं तो इसे फिर से बनाया जाएगा, हालांकि खाली है। क्या आपके द्वारा इसे गिराए जाने के बाद इसमें कोई संग्रह था?
नरकसाल

क्या आप एक ही कनेक्शन का उपयोग कर रहे हैं, या कई कनेक्शन बना रहे हैं?
नरकसाल

12
मैंने पाया कि dropDatabaseआह्वान को कॉलबैक में रखा जाना चाहिए connect, जैसा कि mongoose.connect('...', function() { ...dropDatabase()})
Freewind

1
ड्रॉपडैबस कुछ मामलों में काम नहीं करता है, लेकिन प्रत्यक्ष मोंगो कमांड अभी भी इस्तेमाल किया जा सकता है mongoose.connection.db.executeDbCommand( {dropDatabase:1}, function(err, result) { if (err) { console.log(err); } done(); });
farincz

14

यदि आप @ hellslam का समाधान इस तरह से संशोधित करते हैं तो यह काम करेगा

मैं अपने एकीकरण परीक्षणों के बाद डेटाबेस को छोड़ने के लिए इस तकनीक का उपयोग करता हूं

//CoffeeScript
mongoose = require "mongoose"
conn = mongoose.connect("mongodb://localhost/mydb")

conn.connection.db.dropDatabase()

//JavaScript
var conn, mongoose;
mongoose = require("mongoose");
conn = mongoose.connect("mongodb://localhost/mydb");

conn.connection.db.dropDatabase();

HTH ने कम से कम मेरे लिए यह किया, इसलिए मैंने शेयर करने का फैसला किया =)


क्या इसके साथ db छोड़ना संभव है? db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);
9

2
यह मददगार था, धन्यवाद! हालाँकि, आपके परिवर्तनशील नाम थोड़ा भ्रामक हैं ... mongoose.connectवास्तव में रिटर्न mongoose। इसके बजाय conn = mongoose.connect(...)मैं लिखूंगा mongoose.connect(...)और फिर conn = mongooose.connection
एक पेड nerd

मुझे नहीं लगता कि यह कोड हमेशा काम करेगा क्योंकि connectयह अतुल्यकालिक है। इसलिए यदि कनेक्शन तुरंत नहीं होता है, तो ड्रॉपडॉटबेस () कमांड विफल हो जाएगा। यही कारण है कि ऊपर दिए गए अन्य समाधानों dropDatabaseको कॉलबैक में कमांड को connectस्टेटमेंट या openईवेंट हैंडलर में रखने की सिफारिश की गई है ।
मार्क स्टोसबर्ग

8

@ नर्कस्लैम और @ सिल्वर फाइटर के जवाबों की कोशिश की। मैंने अपने परीक्षण को वापस लेते हुए एक दौड़ की स्थिति पाई। मेरे मामले में मैं मोचा परीक्षण चला रहा हूं और परीक्षण के पहले कार्य में मैं पूरे डीबी को मिटाना चाहता हूं। यहाँ मेरे लिए क्या काम करता है।

var con = mongoose.connect('mongodb://localhost/mydatabase');
mongoose.connection.on('open', function(){
    con.connection.db.dropDatabase(function(err, result){
        done();
    });
});

आप और अधिक पढ़ें https://github.com/Automattic/mongoose/issues/1469


7

4.6.0+ के लिए एक अद्यतन उत्तर, यदि आपके पास वादों के लिए वरीयता है ( डॉक्स देखें ):

mongoose.connect('mongodb://localhost/mydb', { useMongoClient: true })
.then((connection) => {
   connection.db.dropDatabase();
   // alternatively:
   // mongoose.connection.db.dropDatabase();
});

मैंने अपने कोड में इस कोड का परीक्षण किया, जिसमें 4.13.6 mongoose का उपयोग किया गया। इसके अलावा, useMongoClientविकल्प के उपयोग पर ध्यान दें ( डॉक्स देखें )। डॉक्स संकेत देते हैं:

Mongoose के डिफ़ॉल्ट कनेक्शन तर्क को 4.11.0 के रूप में चित्रित किया गया है। कृपया useMongoClient विकल्प का उपयोग करके नए कनेक्शन तर्क का चयन करें, लेकिन सुनिश्चित करें कि यदि आप किसी मौजूदा कोडबेस को अपग्रेड कर रहे हैं तो पहले अपने कनेक्शन का परीक्षण कर लें!


5

यदि आपने अन्य समाधानों के साथ कठिनाई की है, तो वे आपके आवेदन को फिर से शुरू करने पर भरोसा करते हैं यदि आप फिर से अनुक्रमित काम करना चाहते हैं।

मेरी जरूरतों के लिए (अर्थात एक इकाई को चलाने के लिए सभी संग्रह nukes का परीक्षण करने में सक्षम होने के बाद, फिर उन्हें अपने अनुक्रमणिका के साथ फिर से बनाता है), मैंने इस समाधान को लागू किया:

यह अंडरस्कोर .js और async.js लाइब्रेरी पर निर्भर करता है, ताकि वे पेर्क्लेल में अनुक्रमणिकाओं को इकट्ठा कर सकें, अगर आप उस लाइब्रेरी के खिलाफ हैं, तो यह गलत हो सकता है, लेकिन मैं इसे डेवलपर के लिए एक अभ्यासकर्ता के रूप में छोड़ देता हूं।

mongoose.connection.db.executeDbCommand( {dropDatabase:1}, function(err, result) {
  var mongoPath = mongoose.connections[0].host + ':' + mongoose.connections[0].port + '/' + mongoose.connections[0].name
  //Kill the current connection, then re-establish it
  mongoose.connection.close()
  mongoose.connect('mongodb://' + mongoPath, function(err){
    var asyncFunctions = []

    //Loop through all the known schemas, and execute an ensureIndex to make sure we're clean
    _.each(mongoose.connections[0].base.modelSchemas, function(schema, key) {
      asyncFunctions.push(function(cb){
        mongoose.model(key, schema).ensureIndexes(function(){
          return cb()
        })
      })
    })

    async.parallel(asyncFunctions, function(err) {
      console.log('Done dumping all collections and recreating indexes')
    })
  })
})

4

किसी डेटाबेस में एक विशेष संग्रह को खाली करने के लिए:

model.remove(function(err, p){
    if(err){ 
        throw err;
    } else{
        console.log('No Of Documents deleted:' + p);
    }
});

ध्यान दें:

  1. विशेष स्कीमा (जिस संग्रह को आप हटाना चाहते हैं उसका स्कीमा) का जिक्र करते हुए एक मॉडल चुनें।
  2. यह ऑपरेशन डेटाबेस से संग्रह का नाम नहीं हटाएगा।
  3. यह एक संग्रह में सभी दस्तावेजों को हटा देता है।

4

यह मेरे लिए मानगो का काम करता है v4.7.0:

mongoose.connection.dropDatabase();

4

Mongoose में अपने डेटाबेस को छोड़ने का सबसे अच्छा तरीका यह निर्भर करता है कि आप किस Mongoose का उपयोग कर रहे हैं। यदि आप Mongoose के एक संस्करण का उपयोग कर रहे हैं जो 4.6.4 या नया है, तो उस रिलीज़ में जोड़ा गया यह तरीका संभवतः इसके लिए ठीक काम करने वाला है:

mongoose.connection.dropDatabase();

पुरानी रिलीज़ में यह विधि मौजूद नहीं थी। इसके बजाय, आप एक प्रत्यक्ष MongoDB कॉल का उपयोग करने के लिए थे:

mongoose.connection.db.dropDatabase();

हालाँकि, यदि यह डेटाबेस कनेक्शन बनाए जाने के ठीक बाद चलाया गया था, तो संभवतः यह चुपचाप विफल हो सकता है। यह कनेक्शन वास्तव में अतुल्यकालिक है और कमांड होने पर अभी तक सेट नहीं होने से संबंधित है। यह आम तौर पर अन्य Mongoose कॉल के लिए कोई समस्या नहीं है .find(), जो कतार तब तक होती है जब तक कि कनेक्शन खुला न हो और फिर चला जाए।

यदि आप dropDatabase()जोड़े गए शॉर्टकट के स्रोत कोड को देखते हैं, तो आप देख सकते हैं कि इसे इस सटीक समस्या को हल करने के लिए डिज़ाइन किया गया था। यह देखने के लिए जांचें कि क्या कनेक्शन खुला और तैयार है। यदि ऐसा है, तो यह तुरंत कमांड को फायर करता है। यदि नहीं, तो यह डेटाबेस कनेक्शन के खुलने पर चलने के लिए कमांड को पंजीकृत करता है।

ऊपर दिए गए सुझावों में से कुछ हमेशा आपके dropDatabaseकमांड को openहैंडलर में रखने की सलाह देते हैं । लेकिन यह केवल उस मामले में काम करता है जब कनेक्शन अभी तक नहीं खुला है।

Connection.prototype.dropDatabase = function(callback) {
  var Promise = PromiseProvider.get();
  var _this = this;
  var promise = new Promise.ES6(function(resolve, reject) {
    if (_this.readyState !== STATES.connected) {
      _this.on('open', function() {
        _this.db.dropDatabase(function(error) {
          if (error) {
            reject(error);
          } else {
            resolve();
          }
        });
      });
    } else {
      _this.db.dropDatabase(function(error) {
        if (error) {
          reject(error);
        } else {
          resolve();
        }
      });
    }
  });
  if (callback) {
    promise.then(function() { callback(); }, callback);
  }
  return promise;
};

यहाँ उपरोक्त तर्क का एक सरल संस्करण दिया गया है, जिसे पहले के मोंगोसे संस्करणों के साथ प्रयोग किया जा सकता है:

// This shim is backported from Mongoose 4.6.4 to reliably drop a database
// http://stackoverflow.com/a/42860208/254318
// The first arg should be "mongoose.connection"
function dropDatabase (connection, callback) {
    // readyState 1 === 'connected'
    if (connection.readyState !== 1) {
      connection.on('open', function() {
        connection.db.dropDatabase(callback);
      });
    } else {
      connection.db.dropDatabase(callback);
    }
}  

2

Mongoose 4.6.0+:

mongoose.connect('mongodb://localhost/mydb')
mongoose.connection.once('connected', () => {
    mongoose.connection.db.dropDatabase();
});

कनेक्ट करने के लिए कॉलबैक पास करना अब काम नहीं करेगा:

TypeError: null की प्रॉपर्टी 'CommandTakeWriteConcern' को नहीं पढ़ सकता


1
connectएक वादा देता है, तो आप जोड़ सकते हैं .then((connection) => { ... });करने के लिए mongoose.connect। देखें: mongoosejs.com/docs/connections.html
आंद्रे एम

1
beforeEach((done) => {
      mongoose.connection.dropCollection('products',(error ,result) => {
      if (error) {
        console.log('Products Collection is not dropped')
      } else {
        console.log(result)
      }
    done()
    })
  })

0

चूँकि हटाए गए विधि को मानस पुस्तकालय में हटा दिया जाता है इसलिए हम डिलीट फ़ंक्शन का उपयोग कर सकते हैं जिसमें कोई पैरामीटर पारित नहीं हुआ है।

Model.deleteMany();

यह इस विशेष मॉडल की सभी सामग्री को हटा देगा और आपका संग्रह खाली हो जाएगा।


0

एक संग्रह में सभी दस्तावेजों को छोड़ने के लिए:

await mongoose.connection.db.dropDatabase();

यह उत्तर mongoose index.d.ts फ़ाइल पर आधारित है:

dropDatabase(): Promise<any>;

-2

एक संग्रह में सभी दस्तावेजों को छोड़ने के लिए:

myMongooseModel.collection.drop();

जैसा कि परीक्षणों में देखा गया है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.