嗨,有没有办法用猫鼬切换数据库?我以为我可以这样做:
mongoose.disconnect();
mongoose.connect('localhost',db);
但它不起作用我收到此错误:
Error: Trying to open unclosed connection.
不知道是不是因为是异步的
如前所述,您可以使用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 多个不同的连接,mongoose useDb(),mongoDB 驱动切换连接
它是异步的。如果您通过回调函数断开连接并尝试在该回调中连接到下一个数据库,它将起作用。
前任。
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()
})
}
票数最高的答案让我陷入了几个小时的循环。为了帮助 OP 和其他可能遇到相同问题的人,这是我对解决方案的看法:
假设您有两个具有相同架构的数据库,并且您想在它们之间动态切换。让我们称它们为DB1
and DB2
。您可以这样做:
(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 上测试。
实现此目的的一种方法是将数据库名称附加到数据库 URL。例如:如果您正在使用 localhost
mongoose.connect('mongodb://localhost:portNumber/xyz_db');
当你像这样连接时,你所有的模型都会作为一个集合保存在你的模型下的 xyz_db 中。
你应该使用useDb
函数。