Мангуст: заполнение дискриминационного поддокумента
Я хочу заполнить поля вложенного документа, который является дискриминируемым элементом общей схемы (Notificationable
различать в Message
или же FriendRequest
).
Этот вопрос очень похож на этот: mongoosejs: заполнение массива objectId из разных схем, что не было решено два года назад. Так как мангуста эволюционировала, а также дискриминатор, я снова задаю вопрос.
Что я уже пробовал:
Notification.find({_id: 'whatever'})
.populate({
path: 'payload',
match: {type: 'Message'},
populate: ['author', 'messageThread']
})
.populate({
path: 'payload',
match: {type: 'FriendRequest'},
populate: ['to', 'from']
})
.exec();
Это не работает, потому что путь тот же. Итак, я попробовал:
Notification.find({_id: 'whatever'})
.populate({
path: 'payload',
populate: [
{
path: 'messageThread',
match: {type: 'Message'},
},
{
path: 'author',
match: {type: 'Message'},
},
{
path: 'from',
match: {type: 'FriendRequest'},
},
{
path: 'to',
match: {type: 'FriendRequest'},
},
]
})
.exec();
Что тоже не работает, может быть потому, что совпадение выполняется в поддокументе и поэтому не имеет поля type
,
Есть ли решение для этого?
Вот мои (основные) модели, я не предоставил User или MessageThread.
Основной документ:
const NotificationSchema = new Schema({
title: String,
payload: {
type: Schema.Types.ObjectId,
ref: 'Notificationable'
});
mongoose.model('Notification', NotificationSchema);
Родительская схема полезной нагрузки
let NotificationableSchema = new Schema(
{},
{discriminatorKey: 'type', timestamps: true}
);
mongoose.model('Notificationable', NotificationableSchema);
И две разграниченные возможности:
let Message = new Schema({
author: {
type: Schema.Types.ObjectId,
ref: 'User'
},
messageThread: {
type: Schema.Types.ObjectId,
ref: 'MessageThread'
}
}
Notificationable.discriminator('Message', Message);
А также:
let FriendRequest = new Schema({
from: {
type: Schema.Types.ObjectId,
ref: 'User'
},
to: {
type: Schema.Types.ObjectId,
ref: 'User'
}
}
Notificationable.discriminator('FriendRequest', FriendRequest);