Node.js 猫鼬不能做深呼吸

Node.js 猫鼬不能做深呼吸,node.js,mongoose,mongoose-schema,mongoose-populate,Node.js,Mongoose,Mongoose Schema,Mongoose Populate,我已经: UserSchema中的用户模型 来自SpecialtySchema的专业模型 SessionSchema中的会话模型 用户具有参考字段专业: 会话具有引用字段提供程序: 我想得到一个会话列表,其中包含通过提供者填充的提供者用户和深度填充的特殊项 我正在做以下工作: Session .find() .populate({ path: 'provider', model: 'User', populate: { path: 'specialit

我已经:

UserSchema中的用户模型 来自SpecialtySchema的专业模型 SessionSchema中的会话模型 用户具有参考字段专业:

会话具有引用字段提供程序:

我想得到一个会话列表,其中包含通过提供者填充的提供者用户和深度填充的特殊项

我正在做以下工作:

Session
  .find()
  .populate({
    path: 'provider',
    model: 'User',
    populate: {
      path: 'specialities',
      model: 'Specialty',
    }
  })
但是,当我尝试通过provider.specialities而不是填充的版本访问ID时,结果总是返回一个ID数组

专业是一个关键词吗

我不知道为什么这就像根本不填充一样。

快速解决方法是使用

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

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...)
或:


请粘贴您的方案深度人口在哪里?简单的mongoose.model'User.findByIdid在这里。填充'specialities'。。。诸如此类……我想对于病房里的猫鼬4版,你们可以像这样深入居住。填充{path:'provider',model:'User',populate:{path:'specialities',model:'speciality',}}}@num8er,这对正常人群有效,但是,当我试图深入填充会话模型的提供者的特性时,它却没有work@DarkArtistry您可以在尝试深入填充会话模型的提供者的特性的地方添加代码吗?我将使用该解决方案,而不需要额外的库,谢谢
const Session = mongoose.model('Session');
cons user = await Session.findById(id here)
                         .deepPopulate(['provider', 'provider.specialities']);
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;
});