Мангуст не может глубоко заселить - PullRequest
0 голосов
/ 04 июля 2018

Я:

  1. User модель (от UserSchema)
  2. Specialty модель (от SpecialtySchema)
  3. Session модель (от SessionSchema)

У пользователя есть справочное поле specialities:

specialities: [{ type: Schema.Types.ObjectId, ref: 'Specialty' }]

Сессия имеет поле ссылки provider:

provider: { type: Schema.Types.ObjectId, ref: 'Session' }

Я хочу получить список сеансов с заполненным provider (Пользователь) и глубоко заполненным specialities более provider.

Я делаю следующее:

Session
  .find()
  .populate({
    path: 'provider',
    model: 'User',
    populate: {
      path: 'specialities',
      model: 'Specialty',
    }
  })

Однако результаты всегда возвращают массив IDS (когда я пытаюсь получить к ним доступ по provider.specialities вместо заполненной версии.

Специальности - это ключевое слово?

Я не знаю, почему это вообще не заселение.

1 Ответ

0 голосов
/ 05 июля 2018

Быстрое решение состоит в том, чтобы использовать мангуст-глубоконаселенный

В каждой схеме прикрепите его как плагин:

const deepPopulate = require('mongoose-deep-populate')(mongoose);
SessionSchema.plugin(deepPopulate, {
  whitelist: ['provider', 'provider.specialities']
});

, а затем используйте его так:

const Session = mongoose.model('Session');
cons user = await Session.findById(id here)
                         .deepPopulate(['provider', 'provider.specialities']);



Из-за возможных проблем с производительностью я не рекомендую делать глубокое заполнение.

Лучше попытаться переосмыслить Ваши данные.

Также я не могу представить себе вариант использования для этого.

Может быть, вы просто хотите показать список пользователей по специальностям?

А как насчет двух звонков API из внешнего интерфейса:

1st for taking sessions and taking provider ids (ex.: GET /sessions), 

2nd for taking users with populated specialities (ex.: GET /users?ids=first-id,second-id...)

или

let sessions = await Session.find();
let providerIds = sessions.map(session => session.provider);
let users = await User.find({_id: providerIds}).populate('specialities');

sessions = sessions.map(session => {
  session.provider = users.find(user => user._id == session.provider);
  return session;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...