Mongoose: работа с несколькими базами данных при работе с одной моделью

Я хочу иметь произвольные базы данных (например, 50) с одинаковыми коллекциями (одинаковые схемы, точные модели, разные данные) и веб-приложение 1 nodejs (expressjs + mongoose).

Пример упрощенного случая:

У меня есть:

  • одно веб-приложение (expressjs + mongoose) с моделью User.
  • 50 доменов 50 баз данных с коллекцией users.

Какого поведения я хочу добиться:

  • GET /api/users/ http запрос приходит на один из доменов (test-domain-39.myapp.com)
  • app получает запрошенное доменное имя (test-domain-39) и каким-то образом мангуст понимает, что он хочет запросить базу данных-39, когда я просто делаю User.find({isActive: true}) в users.controller

Поэтому мне просто нужна абстракция. Я передаю имя db в mongoose и продолжаю работать с моделью User (как мы все обычно делаем при наличии одного соединения с DB), а mongoose, если нужно, создает соединение (если это первый запрос к конкретной db), поддерживает его в течение следующие запросы в пул соединений и т. д.

Какой самый простой и эффективный способ сделать это?

Заранее спасибо!


person Alex    schedule 14.08.2017    source источник


Ответы (1)


ИМХО, хотя это возможно с MongoDB, я бы не советовал поддерживать отдельную базу данных для каждого домена, особенно если вы ожидаете, что их будет огромное количество. Рассматривали ли вы модель с несколькими арендаторами вместо этого?

Пример кода ниже добавляет пользователя «Алекс» в две разные базы данных, «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();
        }
    });
    });
});
person bentesha    schedule 15.08.2017
comment
Приятно помочь! Дайте мне знать, если это ответит на ваш вопрос @7sides - person bentesha; 23.08.2017