NodeJS Mongoose:在使用一个模型时处理多个数据库

4dbbbstv  于 2022-11-29  发布在  Node.js
关注(0)|答案(2)|浏览(153)

我想要的是有任意的数据库(例如50)与相同的集合(相同的模式,确切的模型,不同的数据)和1个节点(expressjs + mongoose)的web应用程序。
简化案例示例:

我有:
*单个Web应用程序(expressjs + mongoose),具有User模型。

  • 50个域,50个数据库,users集合。
    我想要达到的行为:
  • GET /api/users/ http请求正在到达其中一个域(test-domain-39.myapp.com)
  • 应用程序获得请求的域名(test-domain-39),当我在users.controller中执行User.find({isActive: true})时,mongoose不知何故理解了它想要查询数据库39

因此,我只需要一个抽象。我将数据库名称传递给mongoose,并继续使用User模型(就像我们通常在拥有单个数据库连接时所做的那样),如果需要,mongoose将创建连接(如果这是对特定数据库的第一个请求),并在连接池中为下一个请求保持连接等。
实现这一目标最简单有效的方法是什么?
先谢谢林田了!

58wvjzkj

58wvjzkj1#

恕我直言,虽然MongoDB可以做到这一点,但我不建议为每个域维护一个单独的数据库,特别是如果您希望拥有大量的数据库。您是否考虑过使用多租户模型?
下面的示例代码将用户'Alex'添加到两个不同的数据库“domainOne”和“domainTwo”中。

var mongoose = require('mongoose');
var personSchema = { name: String, domain : String };
var baseUri = 'mongodb://localhost/';

domains.forEach((domain) => {
    var conn = mongoose.createConnection(baseUri + domain, (error) => {
    if(error){
        console.log('Ups! Database connection failed!');
        return;
    }
    //Use the connection object to create your models,
    //instead the mongoose object
    //so that our data is saved into the database
    //associated with this connection
    var Person = conn.model('Person', personSchema);

    //Lets add user 'Alex' into the database
    (new Person({name : 'Alex', domain : domain })).save((error) => {
        if(error){
            console.log('Ups! Could not save person');
        } else {
            conn.close();
        }
    });
    });
});
sulc1iza

sulc1iza2#

这是我如何实现我的项目:

// config/db.ts
import {createConnection} from 'mongoose'

const MONGO_URI = process.env.MONGO_URI

if (!MONGO_URI)
  throw new Error(
    'Please define the MONGO_URI environment variable inside .env'
  )

const connections: any = {}

async function db(dbName: string) {
  if (connections[dbName]) {
    return connections[dbName]
  } else {
    connections[dbName] = createConnection(`${MONGO_URI}/${dbName}`)
    return connections[dbName]
  }
}

export default db



// models/Test.ts
import { Schema } from 'mongoose'

export interface ITest {
  _id: Schema.Types.ObjectId
  name: string
  createdAt?: Date
}

const testSchema = new Schema<ITest>(
  {
    name: { type: String, required: true },
  },
  { timestamps: true }
)

export default testSchema



// pages/api/test.ts
import nc from 'next-connect'
import db from '../../config/db'
import testSchema from '../../models/Test'

const handler = nc()

handler.get(
  async (req: NextApiRequestExtended, res: NextApiResponseExtended) => {
    try {
      const conn = await db(req.headers['x-db-key'])
      const model = await conn.model('Test', testSchema)

      const data = await model.find({})

      res.send(data)
    } catch (error: any) {
      res.status(500).json({ error: error.message })
    }
  }
)

export default handler

相关问题