用mongoose切换数据库

时间:2013-07-25 15:35:50

标签: node.js mongoose

嗨有没有办法用mongoose切换数据库? 我以为我可以这样做:

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

但它不起作用我收到此错误:

Error: Trying to open unclosed connection.

我不知道是不是因为是异步的

5 个答案:

答案 0 :(得分:3)

它是异步的。如果您传递一个回调函数来断开连接并尝试连接到该回调中的下一个数据库,它将起作用。

实施例

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()
  })
}

答案 1 :(得分:0)

您应该使用useDb功能。

答案 2 :(得分:0)

如前所述,您可以使用useDb函数:

示例代码:

async function myDbConnection() {

    const url = 'mongodb+srv://username:password@cluster0-pauvx.mongodb.net/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);
    }
}

或者,如果您想创建一个全新的连接,则必须尝试mongoose.createConnection()。仅供参考,对于mongoDB驱动程序,您可以使用::

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`
  ...
});

参考: mongoose multiple different connectionsmongoose useDb()mongoDB driver switch connections

答案 3 :(得分:0)

最高票数的答案让我陷入了几个小时的循环。为了帮助 OP 和其他可能遇到相同问题的人,以下是我对解决方案的看法:

假设您有两个具有相同架构的数据库,并且您想在它们之间即时切换。我们称它们为 DB1DB2。您可以这样做:

(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');
})();

在 Node.js v12 和 Mongoose v5 上测试。

答案 4 :(得分:0)

实现此目的的一种方法是在数据库名称后附加数据库 URL。例如:如果您使用 localhost

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

当你这样连接时,你所有的模型都会作为一个集合保存在你模型下的 xyz_db 中。