如何用Mongoose单Schema适配多数据库与多集合?
解决MongoDB多库多集合复用Schema与连接的问题
你的问题根源在于每次调用函数都新建数据库连接,导致连接数爆炸触发MongoNetworkError: connect EADDRNOTAVAIL。同时重复创建Schema和Model也会造成冗余。解决方案的关键是复用连接实例、复用Schema、缓存已创建的Model。
具体实现方案
1. 提前初始化主连接并复用
在应用启动时创建一次主连接,而非每次调用函数都新建连接。
2. 只定义一次Schema
所有库和集合共用同一个Schema实例,无需重复创建。
3. 缓存Model实例
针对不同的network(数据库)和dex(集合),缓存已经创建的Model,避免重复定义。
完整代码示例
import mongoose from 'mongoose'; import Config from '../components/config.js'; // 初始化配置 const { localDatabase } = Config(); // 1. 创建并复用主连接实例(模块加载时仅执行一次) const mainConnection = mongoose.createConnection(localDatabase); // 2. 只定义一次Schema,所有库/集合共用 const txSchema = new mongoose.Schema({ uniquePoint: { type: String, required: true, index: true, unique: true, }, version: { type: String, required: true, }, network: { type: String, required: true, }, }); // 3. 缓存已创建的Model,用`network:dex`作为唯一标识 const modelCache = new Map(); export default function getTxModel(dex, network) { const cacheKey = `${network}:${dex}`; // 缓存存在则直接返回,避免重复创建 if (modelCache.has(cacheKey)) { return modelCache.get(cacheKey); } // 获取对应network的数据库实例 const dbInstance = mainConnection.useDb(network); // 创建Model并存入缓存 const txModel = dbInstance.model('TX', txSchema, dex); modelCache.set(cacheKey, txModel); return txModel; }
代码说明
- 连接复用:
mainConnection在模块加载时仅创建一次,后续所有调用都基于这个连接获取不同的数据库实例,不会新增连接数。 - Schema复用:
txSchema只定义一次,避免重复生成相同结构的Schema对象。 - Model缓存:通过
modelCache记录已创建的Model实例,相同network和dex组合直接返回缓存结果,避免重复定义Model引发的异常。
验证效果
现在调用getTxModel('dex1', 'network1')、getTxModel('dex2', 'network1')、getTxModel('dex1', 'network2')这类方法时,只会维持一个主连接,每个唯一的库+集合组合对应一个Model实例,不会出现连接数过载的问题。
内容的提问来源于stack exchange,提问作者Mayga Fatmawati
相关产品推荐
相关产品推荐

