मैं Node.js और Mongoose में एक डेटाबेस निर्माण स्क्रिप्ट तैयार कर रहा हूं। यदि डेटाबेस पहले से मौजूद है, तो मैं कैसे जांच सकता हूं और यदि ऐसा है, तो इसे Mongoose का उपयोग करके हटाएं (हटाएं)?
मुझे इसे मोंगोज़ के साथ छोड़ने का कोई तरीका नहीं मिला।
मैं Node.js और Mongoose में एक डेटाबेस निर्माण स्क्रिप्ट तैयार कर रहा हूं। यदि डेटाबेस पहले से मौजूद है, तो मैं कैसे जांच सकता हूं और यदि ऐसा है, तो इसे Mongoose का उपयोग करके हटाएं (हटाएं)?
मुझे इसे मोंगोज़ के साथ छोड़ने का कोई तरीका नहीं मिला।
जवाबों:
मानस से एक संग्रह छोड़ने के लिए कोई विधि नहीं है, सबसे अच्छा आप कर सकते हैं एक की सामग्री को हटा दें:
Model.remove({}, function(err) {
console.log('collection removed')
});
लेकिन मोंगोडब देशी जावास्क्रिप्ट ड्राइवर तक पहुंचने का एक तरीका है, जिसका उपयोग इसके लिए किया जा सकता है
mongoose.connection.collections['collectionName'].drop( function(err) {
console.log('collection dropped');
});
इस मामले में कुछ भी गलत होने से पहले बैकअप लें!
यदि कोई पहले से ही कनेक्शन पर मौजूद नहीं है, तो Mongoose एक डेटाबेस बनाएगा, इसलिए एक बार कनेक्शन बनाने के बाद, आप यह देख सकते हैं कि उसमें कुछ भी है या नहीं।
आप अपने से जुड़े किसी भी डेटाबेस को छोड़ सकते हैं:
var mongoose = require('mongoose');
/* Connect to the DB */
mongoose.connect('mongodb://localhost/mydatabase',function(){
/* Drop the DB */
mongoose.connection.db.dropDatabase();
});
mongoose.connection.db.dropDatabase()
लेकिन मैंने पाया db अभी भी है? क्या मुझे कुछ याद है?
dropDatabase
आह्वान को कॉलबैक में रखा जाना चाहिए connect
, जैसा कि mongoose.connect('...', function() { ...dropDatabase()})
।
mongoose.connection.db.executeDbCommand( {dropDatabase:1}, function(err, result) { if (err) { console.log(err); } done(); });
यदि आप @ 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 = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);
mongoose.connect
वास्तव में रिटर्न mongoose
। इसके बजाय conn = mongoose.connect(...)
मैं लिखूंगा mongoose.connect(...)
और फिर conn = mongooose.connection
।
connect
यह अतुल्यकालिक है। इसलिए यदि कनेक्शन तुरंत नहीं होता है, तो ड्रॉपडॉटबेस () कमांड विफल हो जाएगा। यही कारण है कि ऊपर दिए गए अन्य समाधानों dropDatabase
को कॉलबैक में कमांड को connect
स्टेटमेंट या open
ईवेंट हैंडलर में रखने की सिफारिश की गई है ।
@ नर्कस्लैम और @ सिल्वर फाइटर के जवाबों की कोशिश की। मैंने अपने परीक्षण को वापस लेते हुए एक दौड़ की स्थिति पाई। मेरे मामले में मैं मोचा परीक्षण चला रहा हूं और परीक्षण के पहले कार्य में मैं पूरे डीबी को मिटाना चाहता हूं। यहाँ मेरे लिए क्या काम करता है।
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
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 विकल्प का उपयोग करके नए कनेक्शन तर्क का चयन करें, लेकिन सुनिश्चित करें कि यदि आप किसी मौजूदा कोडबेस को अपग्रेड कर रहे हैं तो पहले अपने कनेक्शन का परीक्षण कर लें!
यदि आपने अन्य समाधानों के साथ कठिनाई की है, तो वे आपके आवेदन को फिर से शुरू करने पर भरोसा करते हैं यदि आप फिर से अनुक्रमित काम करना चाहते हैं।
मेरी जरूरतों के लिए (अर्थात एक इकाई को चलाने के लिए सभी संग्रह 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')
})
})
})
किसी डेटाबेस में एक विशेष संग्रह को खाली करने के लिए:
model.remove(function(err, p){
if(err){
throw err;
} else{
console.log('No Of Documents deleted:' + p);
}
});
ध्यान दें:
यह मेरे लिए मानगो का काम करता है v4.7.0
:
mongoose.connection.dropDatabase();
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);
}
}
Mongoose 4.6.0+:
mongoose.connect('mongodb://localhost/mydb')
mongoose.connection.once('connected', () => {
mongoose.connection.db.dropDatabase();
});
कनेक्ट करने के लिए कॉलबैक पास करना अब काम नहीं करेगा:
TypeError: null की प्रॉपर्टी 'CommandTakeWriteConcern' को नहीं पढ़ सकता
connect
एक वादा देता है, तो आप जोड़ सकते हैं .then((connection) => { ... });
करने के लिए mongoose.connect
। देखें: mongoosejs.com/docs/connections.html
चूँकि हटाए गए विधि को मानस पुस्तकालय में हटा दिया जाता है इसलिए हम डिलीट फ़ंक्शन का उपयोग कर सकते हैं जिसमें कोई पैरामीटर पारित नहीं हुआ है।
Model.deleteMany();
यह इस विशेष मॉडल की सभी सामग्री को हटा देगा और आपका संग्रह खाली हो जाएगा।