Мангусты заселяют 2 базы данных

У меня есть node app, который использует 2 базы данных. Один - это Names, а другой - все остальные данные.

У меня есть эта настройка подключения:

// DATABASE CONNECTION
var APP_DB_URI = config.APP_DB; // mongodb://localhost:27017/app_db
var app_DB = mongoose.createConnection(APP_DB_URI);
var name_DB = app_DB.useDb(config.NAME_DB); // 'name_db'

Это соединение работает правильно.

Также нет проблем с сохранением данных как в app_db, так и в names_db, которые работают отлично.

Но проблема вот в чем: когда я пытаюсь запросить, скажем, модель Account, а затем заполнить указанную модель Name, процесс заполнения возвращает null.

Схема аккаунта:

 var mongoose = require('mongoose');
 var Schema = mongoose.Schema;
 var field = {
     email: {type: String, unique: true},
     password: {type: String, select: false},
     name: {type: Schema.Types.ObjectId, ref: 'Name'},
 }

 var options = {
     id: false,
     versionKey: false
 }

 var schema = new Schema(field, options);
 module.exports = mongoose.model('Account', schema);

Схема Имя:

 'use strict';

 var mongoose = require('mongoose'); 
 var Schema = mongoose.Schema;

 var field = {
     firstName: {type: String, required: true},
     middleName: {type: String, required: true},
     lastName: {type: String, required: true},
     suffix: {type: String, required: false,},
 }

 var options = {
     id: false,
     versionKey: false
 }

 var schema = new Schema(field, options);
 module.exports = mongoose.model('Name', schema);

Запрос и население:

var app_db = *app_db instance passed to this controller*    

var Account = app_db.model('Account');

Account.findOne({email:req.body.email})
    .populate('name')
    .exec(function (err, user) {
        if(user){
            // user.name returns null
        }
    })

Есть ли особый способ заполнения данных из db1 данными из db2? Спасибо.


person CENT1PEDE    schedule 23.02.2016    source источник
comment
@marc_s Спасибо за исправление   -  person CENT1PEDE    schedule 23.02.2016


Ответы (1)


Функция Заполнять документы Mongo между базами данных добавлена ​​с mongoose v3.9.0. В соответствии с этим в тесте заполнения базы данных, вы должны использовать другое имя базы данных, когда вызывается model. Некоторые примеры кодов, как показано ниже. Более подробную информацию см. в тестовых кодах по ссылке.

var app_DB = mongoose.createConnection(APP_DB_URI);
var name_DB = app_DB.useDb(config.NAME_DB); // 'name_db'

// ...
module.exports = app_DB.model('Account', schema);

// ...
module.exports = name_DB.model('Name', schema);

Заполнить

.populate('name', '', Name)
person zangw    schedule 23.02.2016
comment
Я сделал точно так же. Но население по-прежнему не работает. - person CENT1PEDE; 23.02.2016
comment
Какие именно параметры я должен указать для .populate() после этого? .populate('name') сейчас работает. - person CENT1PEDE; 23.02.2016
comment
Я понял. .populate('name', '', Name) во-первых, это эталонный ключ, я не понимаю, что такое 2-й параметр, поэтому я просто оставляю его ' ', затем 3-й является эталонной моделью - person CENT1PEDE; 23.02.2016
comment
@TheGreenFoxx, обратитесь к этому документу, второй параметр [select] <Object, String> Field selection for the population query - person zangw; 23.02.2016
comment
@ CENT1PEDE второй параметр определяет поля, которые вы хотите выбрать из модели, на которую ссылаются. в моем случае это имя фамилия без запятых - person Moses; 22.01.2020
comment
Я потратил 2 часа, пытаясь сделать все, чтобы это заработало, и ваше решение сработало @zangw - это должно быть объяснено в документах Mongoose, что вам нужно указать модель, если вы используете useDb, потому что это нигде не объясняется. - person Luke Brown; 24.06.2020