মঙ্গুজের সাথে কীভাবে একটি ডাটাবেস ড্রপ করবেন?


99

আমি নোড.জেএস এবং মঙ্গুজে একটি ডাটাবেস তৈরি স্ক্রিপ্ট প্রস্তুত করছি। ডেটাবেস ইতিমধ্যে বিদ্যমান আছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি এবং যদি তা হয় তবে এটি মঙ্গুজ ব্যবহার করে ড্রপ (মুছুন) করুন?

এটি মুঙ্গুসের সাথে ফেলে দেওয়ার কোনও উপায় আমি খুঁজে পেলাম না।


উত্তর:


168

মঙ্গুজ থেকে সংগ্রহ বাদ দেওয়ার কোনও পদ্ধতি নেই, আপনি যা করতে পারেন তা হ'ল কোনওটির সামগ্রী মুছে ফেলা:

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

তবে মঙ্গডব নেটিভ জাভাস্ক্রিপ্ট ড্রাইভারটি অ্যাক্সেস করার একটি উপায় রয়েছে যা এর জন্য ব্যবহার করা যেতে পারে

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

সতর্কতা

কিছু ভুল হয়ে যাওয়ার আগে চেষ্টা করার আগে একটি ব্যাকআপ করুন!


4
যখন আমি দ্বিতীয় বিকল্পটি চেষ্টা করি তখন আমি "
অপরিজ্ঞাতকৃত

4
যেহেতু সমস্ত সংগ্রহ হ্যাশ মঙ্গুজে.কনেকশন.কলেকশনগুলিতে রয়েছে, আপনি কেবল তাদের জন্য তালিকাভুক্ত করতে পারেন (মংগস কনসেকশন.কলেকশনগুলিতে সংগ্রহ) {মঙ্গুজ.কননেশন.কলেকশনস [সংগ্রহ] .ড্রপ} ...
স্মেথ

4
আপনার একটি টাইপ রয়েছে - ফাংশনের পরে অতিরিক্ত কমা (ভুল) ... হওয়া উচিত: mongoose.connection.colલેક્શન ['সংগ্রহের নাম']। ড্রপ (ফাংশন (ত্রুটি) {কনসোল.লগ ('সংগ্রহ বাদ পড়েছে)' ;});
আর্ক্সপেটিকা

4
আমি কি কেবলমাত্র এই উত্তরটি বুঝতে পেরেছি যে কীভাবে একটি ডেটাবেস ড্রপ করবেন সেই প্রশ্নের সমাধান করে না। এটি কোনও ডাটাবেস ফেলতে
জোসেফ পারসি

4
"মঙ্গুজ থেকে সংগ্রহ বাদ দেওয়ার কোনও পদ্ধতি নেই", প্রথমে ওপি একটি কোলেশন নয় একটি ডাটাবেস মুছতে চায়, দ্বিতীয়ত নীচে @ হেলস্লামের উত্তরটি ভালভাবে কাজ করে।
এসসিবিউজারেল.থ

81

যদি সংযোগে ইতিমধ্যে কোনও উপস্থিত না থাকে তবে মঙ্গুজ একটি ডাটাবেস তৈরি করবে, সুতরাং একবার সংযোগটি তৈরি করার পরে আপনি এটিতে কিছু আছে কিনা তা দেখার জন্য এটি অনুসন্ধান করতে পারেন।

আপনার সাথে সংযুক্ত যে কোনও ডাটাবেস আপনি ফেলে দিতে পারেন:

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

4
আমি চেষ্টা করেছিলাম mongoose.connection.db.dropDatabase()কিন্তু আমি দেখতে পেলাম যে ডিবি এখনও আছে? আমি কি কিছু মিস করছি?
ফ্রিউইন্ড

আপনি যদি পরে এটির সাথে যুক্ত হন তবে এটি খালি থাকলেও এটি পুনরায় তৈরি করা হবে। আপনি এটি বাদ দেওয়ার পরে এটিতে কোনও সংগ্রহ ছিল?
হেলস্লাম

আপনি কি একই সংযোগ জুড়ে ব্যবহার করছেন, বা একাধিক সংযোগ তৈরি করছেন?
হেলস্লাম

12
আমি দেখতে পেয়েছি যে dropDatabaseঅনুরোধটি কলব্যাকে রাখা উচিত connect, যেমন mongoose.connect('...', function() { ...dropDatabase()})
ফ্রিউইন্ড

4
ড্রপডাটাবেস কিছু ক্ষেত্রে কাজ করে না বলে মনে হয়, তবে সরাসরি মঙ্গো কমান্ডটি এখনও ব্যবহার করা যায় mongoose.connection.db.executeDbCommand( {dropDatabase:1}, function(err, result) { if (err) { console.log(err); } done(); });
farincz

14

আপনি যদি @ হেলস্লামের সমাধানটিকে এভাবে পরিবর্তন করেন তবে এটি কার্যকর হবে

আমি আমার ইন্টিগ্রেশন পরীক্ষার পরে ডেটাবেস ড্রপ করতে এই কৌশলটি ব্যবহার করি

//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();

এইচটিএইচ কমপক্ষে এটি আমার জন্য করেছে, তাই আমি ভাগ করে নেওয়ার সিদ্ধান্ত নিয়েছি =)


এটি দিয়ে কি ডিবি বাদ দেওয়া সম্ভব? db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);
chovy

4
এটি সহায়ক ছিল, ধন্যবাদ! যাইহোক, আপনার পরিবর্তনশীল নামের একটু বিভ্রান্তিকর ... হয় mongoose.connectআসলে আয় mongoose। পরিবর্তে conn = mongoose.connect(...)আমি লিখতে mongoose.connect(...)এবং তারপর conn = mongooose.connection
একটি অর্থপ্রদান অগ্রে

আমি মনে করি না যে এই কোডটি সর্বদা কাজ করবে কারণ এটি connectঅ্যাসিনক্রোনাস। সুতরাং যদি সংযোগটি তাত্ক্ষণিকভাবে না ঘটে তবে ড্রপড্যাটাস ডাটাবেস () কমান্ড ব্যর্থ হবে। সে কারণেই উপরের অন্যান্য সমাধানগুলি বিবৃতিতে বা ইভেন্ট হ্যান্ডলারের dropDatabaseকাছে কলব্যাকে কমান্ডটি রাখার প্রস্তাব দেয় । connectopen
মার্ক স্টসবার্গ

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 ব্যবহার করে পরীক্ষা করেছি। এছাড়াও, useMongoClientবিকল্পটির ব্যবহারটি নোট করুন ( দস্তাবেজগুলি দেখুন )। দস্তাবেজগুলি ইঙ্গিত করে:

মঙ্গুজের ডিফল্ট সংযোগ যুক্তি 4.11.0 হিসাবে অবহিত করা হয়েছে। দয়া করে মঙ্গোস্লায়েন্ট বিকল্পটি ব্যবহার করে নতুন সংযোগ যুক্তিকে বেছে নিন, তবে আপনি যদি কোনও বিদ্যমান কোডবেস আপগ্রেড করেন তবে প্রথমে আপনার সংযোগগুলি পরীক্ষা করে নিন তা নিশ্চিত করুন!


5

অন্যান্য সমাধানগুলির সাথে আমার যে অসুবিধা হয়েছিল তা হ'ল যদি আপনি সূচকগুলি আবার কাজ করতে চান তবে তারা আপনার অ্যাপ্লিকেশনটি পুনরায় চালু করার উপর নির্ভর করে।

আমার প্রয়োজনের জন্য (অর্থাত্ ইউনিট পরীক্ষা করতে সক্ষম হয়ে সমস্ত সংগ্রহকে কেন্দ্র করে, তারপরে তাদের সূচকগুলি সহ পুনরায় তৈরি করুন), আমি এই সমাধানটি বাস্তবায়ন করে শেষ করেছি:

এটি প্যারেলেলের সূচকগুলি একত্র করার জন্য আন্ডারস্কোর.জেএস এবং 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

মঙ্গুজে আপনার ডাটাবেসটি ফেলে দেওয়ার সর্বোত্তম উপায়টি আপনি মঙ্গুজের কোন সংস্করণ ব্যবহার করছেন তার উপর নির্ভর করে। আপনি যদি মঙ্গুজের কোনও সংস্করণ ব্যবহার করেন যা 4..6.৪ বা তার থেকেও বেশি নতুন সংস্করণ ব্যবহার করা হচ্ছে, তবে এই রিলিজটিতে যুক্ত হওয়া এই পদ্ধতিটি সম্ভবত আপনার পক্ষে কাজ করবে:

mongoose.connection.dropDatabase();

পুরানো রিলিজে এই পদ্ধতিটির অস্তিত্ব ছিল না। পরিবর্তে, আপনি সরাসরি মংগোডিবি কলটি ব্যবহার করবেন:

mongoose.connection.db.dropDatabase();

তবে, এটি ডাটাবেস সংযোগ তৈরি করার ঠিক পরে চালানো হলে, এটি সম্ভবত নিঃশব্দে ব্যর্থ হতে পারে। এটি সংযোগটির সাথে সম্পর্কিত যা আসলে অ্যাসিনক্রোনাস এবং কমান্ডটি হওয়ার পরে এখনও সেট আপ করা হয় না। এটি অন্যান্য মঙ্গুজ কলগুলির মতো সাধারণত সমস্যা হয় না.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

মঙ্গুজ ৪.6.০+:

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

সংযোগ করতে একটি কলব্যাক পাস করা আর কাজ করবে না:

প্রকারের ত্রুটি: নালীর সম্পত্তি 'কমান্ডটেকট্রাইটকনসরন' পড়তে পারে না


4
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();

এই উত্তরটি মঙ্গুজের সূচক.ড.টি.এস ফাইলের ভিত্তিতে তৈরি:

dropDatabase(): Promise<any>;

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.