Mongoose 无法进行深度填充

Posted

技术标签:

【中文标题】Mongoose 无法进行深度填充【英文标题】:Mongoose cannot do deep populate 【发布时间】:2018-12-12 19:44:42 【问题描述】:

我已经:

    User 模型(来自UserSchemaSpecialty 模型(来自SpecialtySchemaSession 模型(来自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 而不是填充版本访问它们时。

专业是关键字吗?

我不知道为什么它就像根本没有填充。

【问题讨论】:

请粘贴您的架构 深度人口在哪里?只需mongoose.model('User').findById(id here).populate('specialities')...等等... 我认为 mongoose 版本 4 的病房可以像这样深入填充? .populate( path: 'provider', model: 'User', populate: path: 'specialities', model: 'Specialty', ) @num8er 适用于正常人群,但是当我尝试深入填充 Session 模型的提供者的专业时它不起作用 @DarkArtistry 你可以在你try to deep populate a Session model's provider's specialities 的地方添加你的代码吗? 【参考方案1】:

快速解决方案是使用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;
);

【讨论】:

我将使用该解决方案而不需要额外的库,谢谢

以上是关于Mongoose 无法进行深度填充的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用

猫鼬嵌套/深度填充

Mongoose + GraphQL 无法填充模型 [重复]

MongoDB/Mongoose:在填充字段中排序

尝试加入两个文档时无法在 Mongoose 中填充路径

使用 Mongoose 进行虚拟填充