Мангуст: заполнение дискриминационного поддокумента

Я хочу заполнить поля вложенного документа, который является дискриминируемым элементом общей схемы (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);

0 ответов

Другие вопросы по тегам