【问题标题】:switching database with mongoose用猫鼬切换数据库
【发布时间】:2021-07-22 20:15:32
【问题描述】:

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

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

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

Error: Trying to open unclosed connection.

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

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

    如前所述,您可以使用 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 connections, mongoose useDb(), mongoDB driver switch connections

    【讨论】:

      【解决方案2】:

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

      例如

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

      【讨论】:

      • 谢谢它有效,请问为什么我必须调用 process.exit()?
      • 根本不需要。这只是我编写的一个小示例脚本,展示了该功能。
      【解决方案3】:

      票数最高的答案让我陷入了几个小时的循环。为了帮助 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】:

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

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

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

        【讨论】:

          【解决方案5】:

          你应该使用useDb函数。

          【讨论】:

          • 虽然我同意你的观点,但你应该添加一些代码来展示 OP 如何使用useDb
          猜你喜欢
          • 1970-01-01
          • 2021-11-16
          • 2020-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-02
          • 2015-05-20
          • 1970-01-01
          相关资源
          最近更新 更多