Я хочу заполнить ObjectId в массиве вложенных документов, где вложенные документы используют динамический c ref. Т.е. у меня есть модель «Комментарий», которая ссылается на создателя, который относится к типу модели «Пользователь» или «Художник»:
const CommentSchema = new Schema({
id: ObjectId,
by: {
type: ObjectId,
refPath: 'byModel',
required: true
},
byModel: {
type: String,
required: true,
enum: ['User', 'Artist'],
default: 'User'
},
...
},
);
Когда я делаю Comment.model.find({}).populate('by')
, я получаю заполненное поле с eiter a Пользователь или исполнитель, как и ожидалось.
Однако теперь у меня есть модель «Лента», которая содержит массив комментариев:
const TapeSchema = new Schema(
{
title: {type: String, required: true, max: 500,unique: true},
artist: { type: ObjectId, ref: 'Artist'},
comments: [{type: ObjectId, ref: 'Comment'}],
...
}
});
Теперь я хочу заполнить tape.comments.by
:
const tape = await Tape.model.findById(req.params.id).populate(['comments', 'comments.by', 'tracks', 'artist'])
if(!tape)
... //do some exception handling
res.status(200).send(tape)
Это не работает. Моя лента возвращается, комментарии заполняются по желанию, byModel
существует и содержит соответственно 'User' / 'Artist', но comments.by
- это просто ObjectId и не заполняется.
Я уже пробовал явный выбор .select(['comments.by, comments.byModel'])
без изменений.