猫鼬不能做得很深

时间:2018-07-04 11:20:39

标签: node.js mongoose mongoose-schema mongoose-populate

我已经

  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 :(得分:0)

快速解决方案是使用mongoose-deep-populate

在每个模式中,将其作为插件附加

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']);



由于可能的性能问题,我不建议进行深度填充。

最好重新考虑您的数据。

我也无法想象用例。

也许您只想显示具有特殊性的用户列表?

仅从前端执行2个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;
});