Как я могу сделать так, чтобы вложенный документ истекал в определенную дату в мангусте?

У меня есть следующая схема для виртуального класса в мангусте:

var classroomSchema = mongoose.Schema({
    studentIds: [mongoose.Schema.Types.ObjectId],
    teacherIds: [mongoose.Schema.Types.ObjectId],
    teacherNames: [String],
    createdAt: {
        type: Date,
        default: Date.now(),
    },
    lessons: [{
        name: String,
        startDate: {
            type: Date,
            min: Date.now(),
        },
        endDate: {
            type: Date,
            min: Date.now(),
        },
        **expiresAt: endDate,**
    }],
});

Я хочу, чтобы срок действия каждого урока истекал из класса после того, как прошла endDate. Как я могу использовать TTL в поддокументах в мангусте?


person lightbringer    schedule 29.06.2017    source источник


Ответы (1)


Часть документа нельзя удалить с ttl. Я могу думать о двух других вариантах обходного пути:

  1. Справочник

Вынесите lesson в свою коллекцию и поместите в нее classroom_id как ссылку на классную комнату. Таким образом, вы сможете удалить урок в одиночку с ttl.

  1. Cronjob/Планировщик

Используйте планировщик, например cron, чтобы запускать задание каждые несколько минут/часов, чтобы найти в классах уроки с пройденные даты истечения срока действия и удалить их из массива lesson.

var CronJob = require('cron').CronJob;

var job = new CronJob({
    cronTime: '00 */20 * * * *', //run every 20 minutes
    onTick: function() {
        //Find classrooms with lessons which have expiry date smaller than Date.now
        //Remove those lessons from array and update the classrooms
    },
    start: false,
    timeZone: 'America/Los_Angeles'
});

job.start();

Для поиска expiresAt в массиве вложенных документов вы можете использовать оператор $elemMatch, как показано в этом примере.

Единственным недостатком метода 2 является то, что в зависимости от выбранного вами интервала cronjob уроки могут сохраняться после истечения срока их действия в течение нескольких дополнительных минут.

person Talha Awan    schedule 30.06.2017