Mongoose多库连接时如何将指定模型仅绑定到db2连接
解决方案
核心原因是你用了全局的mongoose.model()方法注册模型,这个方法默认会把模型绑定到Mongoose的全局默认连接mongoose.connection上,要把模型绑定到指定的独立连接,直接调用对应连接实例的model()方法注册即可。
需要先修正的原有代码问题
- 模型定义存在笔误:
User模型的模型名误写为Criterion,会和第一个模型重名冲突;Schema字段类型写了小写string,Mongoose要求使用JS原生构造函数大写String作为类型声明,否则会抛出类型错误 - 路由中直接调用
collection("users")拿到的是原生MongoDB驱动的集合引用,不是查询结果,需要追加查询方法和toArray()才能拿到实际文档数据
完整修正代码
连接与模型定义
const mongoose = require('mongoose'); const express = require('express'); const app = express(); // 初始化两个独立连接 const db1 = mongoose.createConnection("atlasuri"); const db2 = mongoose.createConnection("localuri"); // 如需显式等待连接就绪可保留对应Promise,连接实例本身支持操作排队,提前注册模型不会报错 const db1Ready = db1.asPromise(); const db2Ready = db2.asPromise(); // 所有需要绑定到db2的模型,统一调用db2.model()注册,完全不关联默认连接与db1 const Criterion1 = db2.model('Criterion', new mongoose.Schema({ name: String })); const User = db2.model('User', new mongoose.Schema({ name: String }));
路由使用示例
app.get("/", async(req, res)=>{ // 等待db1连接就绪,用原生集合方法查询db1数据,不涉及任何模型 const db1Conn = await db1Ready; const db1Users = await db1Conn.collection("users").find({}).toArray(); db1Users.forEach(el=> console.log(el)); // 直接调用db2上注册的模型,所有操作自动指向db2对应的数据库 const db2Criterions = await Criterion1.find(); const db2Users = await User.find(); res.json({ db1Users, db2Criterions, db2Users }) }) // 可选:等待两个连接都就绪后再启动服务 Promise.all([db1Ready, db2Ready]).then(() => { app.listen(3000, () => { console.log('服务启动成功') }) })
额外说明
- 这种方式注册的模型完全和全局默认连接隔离,db1连接不会加载这两个模型,完全符合你“db1直接查集合、db2绑定两个模型”的需求
- 不要混用全局
mongoose.model()和连接实例的model()方法注册同名模型,否则会触发重复注册错误 - 独立连接上注册的模型,和全局连接上的同名模型互不干扰,不会出现跨连接操作数据的问题
内容的提问来源于stack exchange,提问作者Agustin R
相关产品推荐
相关产品推荐

