Быстрое решение состоит в том, чтобы использовать мангуст-глубоконаселенный
В каждой схеме прикрепите его как плагин:
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;
});