You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:10:57