猫鼬不能做深度填充
Mongoose cannot do deep populate
我已经:
User
模型(来自 UserSchema
)
Specialty
模型(来自 SpecialtySchema
)
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',
}
})
但是结果总是 return IDS 数组(当我尝试通过 provider.specialities
而不是填充版本访问它们时。
专业是关键字吗?
我不知道为什么它根本没有填充。
快速解决方案是使用 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;
});
我已经:
User
模型(来自UserSchema
)Specialty
模型(来自SpecialtySchema
)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',
}
})
但是结果总是 return IDS 数组(当我尝试通过 provider.specialities
而不是填充版本访问它们时。
专业是关键字吗?
我不知道为什么它根本没有填充。
快速解决方案是使用 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;
});