如何实现MongoDB Schema动态切换数据库与集合?
实现MongoDB动态Schema以操作多数据库/集合的方案
核心思路
把数据库连接、模型创建逻辑封装成可接收参数的函数,通过传入network(目标数据库名)和dex(目标集合名),动态生成对应的数据模型,不用重复复制修改Schema文件。
修改后的动态Schema模块
import mongoose from 'mongoose'; const db = mongoose.createConnection(database); // 保留基础连接 // 封装动态生成模型的函数 export function getTxModel(network, dex) { // 获取指定network的数据库实例 const targetDb = db.useDb(network); // 检查模型是否已存在,避免重复创建 if (targetDb.models[`TX_${network}_${dex}`]) { return targetDb.models[`TX_${network}_${dex}`]; } // 基础Schema结构和原代码一致 const txSchema = new mongoose.Schema({ uniquePoint: { type: String, required: true, index: true, unique: true, }, pairAddress: { type: String, required: true, } }, { collection: dex }); // 动态指定集合名 // 创建带唯一标识的模型并返回 return targetDb.model(`TX_${network}_${dex}`, txSchema); }
修改后的保存逻辑
import { getTxModel } from '../models/dynamicTxModel.js'; // 引入动态模型函数 export function saveTX(data, network, dex) { try { // 动态获取对应network和dex的模型 const Transactions = getTxModel(network, dex); const newTX = new Transactions(data); newTX.save((err) => { if (err) { if (err.code === 11000) return; // 处理唯一键重复的情况 console.log(err, data.pairAddress); } }); } catch (err) { // 可按需添加错误日志逻辑 } }
使用示例
调用保存函数时直接传入目标数据库和集合名称即可:
// 保存到BSC数据库的PCS集合 saveTX(txData, 'BSC', 'PCS'); // 保存到ETH数据库的Uniswap集合 saveTX(txData, 'ETH', 'Uniswap');
内容的提问来源于stack exchange,提问作者Mayga Fatmawati
相关产品推荐
相关产品推荐

