node.js - Mongoose:使用一个模型时处理多个数据库

标签 node.js express design-patterns mongoose high-load

我想要的是拥有具有相同集合(相同模式、精确模型、不同数据)的任意数据库(例如 50 个)和 1 个 NodeJS(expressjs + mongoose)Web 应用程序。

简化案例示例:

我有:

  • 具有 User 模型的单个 Web 应用程序(expressjs + mongoose)。
  • 50 个域、50 个数据库以及用户集合。

我想要实现什么行为:

  • GET/api/users/ http 请求传入域之一 (test-domain-39.myapp.com)
  • 应用程序获取请求的域名(test-domain-39),并且当我在users.controller中执行User.find({isActive: true})时, Mongoose 以某种方式理解它想要查询database-39

所以我只想要一个抽象。我将数据库名称传递给 mongoose 并继续使用 User 模型(就像我们在拥有单个数据库连接时通常所做的那样),并且 mongoose 如果需要,会创建连接(如果这是对特定数据库的第一个请求),并使其在连接池中的下一个请求等中保持事件状态。

实现这一目标最简单、最有效的方法是什么?

提前致谢!

最佳答案

恕我直言,虽然 MongoDB 可以做到这一点,但我不建议为每个域维护一个单独的数据库,特别是如果您预计拥有大量数据库。您是否考虑过采用 Multi-Tenancy 模型?

下面的示例代码将用户“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();
        }
    });
    });
});

关于node.js - Mongoose:使用一个模型时处理多个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45674964/

相关文章:

javascript - 如何在不为输出数组获取空值的情况下拆分字符串

JavaScript 在类中使用 async/await

javascript - 如何修复path.json不是一个函数

javascript - 如何通过nestjs在同一 Controller 中使用多个diskStorage目的地

php - 如何为持久性 PHP FastCGI 进程设计应用程序?

node.js - Node :send a mail via a custom smtp server

node.js - 如何使用 mongoose 在 updateOne 中使用 $cond?

javascript - 在 express 的路由处理程序中临时覆盖原型(prototype)方法是否安全?

java - 在 Java 应用程序中跨层传递枚举

c++ - 如何成功解耦这些类