arpho
arpho

Reputation: 1646

switching database with mongoose

Hi is there a way to switch database with mongoose? I thought I could do it like that:

mongoose.disconnect();
mongoose.connect('localhost',db);

but it does not work I receive this error:

Error: Trying to open unclosed connection.

I do not know if it is because is asynchronous

Upvotes: 5

Views: 15734

Answers (5)

xpepermint
xpepermint

Reputation: 36243

You should use the useDb function like so:

mongoose.connect(process.env.MONGO_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true
});

mongoose.connection.useDb('Users'); # Change the string to the name of the database you want to use

Upvotes: -2

Tim Kapil
Tim Kapil

Reputation: 1

One way you can achieve this is by appending the database name with the database URL. For eg: if you are working with localhost

mongoose.connect('mongodb://localhost:portNumber/xyz_db');

When you connect like this, all your models will be saved in the xyz_db under your model as a collection.

Upvotes: 0

ilyakam
ilyakam

Reputation: 637

The top-voted answer had thrown me in a loop for a few hours. To help the OP and others who may have the same issue, here's my take on the solution:

Suppose you have two databases with the same schema and you want to switch between them on the fly. Let's call them DB1 and DB2. Here's how you can go about doing that:

(async () => {
  const connection = await mongoose.createConnection(url, options);
  
  const getModel = (database) => {
    const dbConnection = connection.useDb(database);
    
    return dbConnection.model('Model', modelSchema);
  };
  
  const Db1Model = getModel('DB1');
  const Db2Model = getModel('DB2');
})();

Tested on Node.js v12 and Mongoose v5.

Upvotes: 1

whoami - fakeFaceTrueSoul
whoami - fakeFaceTrueSoul

Reputation: 17915

As already stated you could do it using useDb function :

Example code :

async function myDbConnection() {

    const url = 'mongodb+srv://username:[email protected]/test?retryWrites=true&w=majority';

    try {
        await mongoose.connect(url, { useNewUrlParser: true });
        console.log('Connected Successfully')
        // Here from above url you've already got connected to test DB,
           So let's make a switch as needed.
        mongoose.connection.useDb('myDB'); // Switching happens here..
        /**
         * Do some DB transaction with mongoose models as by now models has already been registered to created DB connection
         */
    } catch (error) {
        console.log('Error connecting to DB ::', error);
    }
}

Or if you wanted to create a complete new connection then you've to try mongoose.createConnection(). Just for reference in case of mongoDB driver you would use ::

mongodb.MongoClient.connect(mongourl, function(err, primaryDB) {
  // open another database over the same connection
  const secondaryDB = primaryDB.db(SECONDARY_DATABASE_NAME);

  // now you can use both `database` and `database2`
  ...
});

Ref : mongoose multiple different connections, mongoose useDb(), mongoDB driver switch connections

Upvotes: 6

Evan Lucas
Evan Lucas

Reputation: 632

It is asynchronous. If you pass a callback function to disconnect and try to connect to the next database in that callback, it will work.

Ex.

var mongoose = require('mongoose')

mongoose.connect('mongodb://localhost/test1', function() {
  console.log('Connected to test 1')
  mongoose.disconnect(connectToTest2)
})

function connectToTest2() {
  mongoose.connect('mongodb://localhost/test2', function() {
    console.log('Connected to test 2')
    process.exit()
  })
}

Upvotes: 3

Related Questions