2017-06-29 5 views
1

J'ai le schéma ci-dessous pour une salle de classe virtuelle dans mangouste:Comment faire pour qu'un sous-document expire à une date particulière dans mongoose?

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,** 
    }], 
}); 

Je veux chaque leçon d'expirer de la classe après theer endDate a passé. Comment puis-je utiliser les TTL dans les sous-documents de mongoose?

Répondre

1

Une partie du document ne peut pas être supprimée avec ttl. Je peux penser à deux autres options comme une solution de contournement:

  1. Référence

Retirez lesson à sa propre collection et placez classroom_id en elle comme référence à la classe. De cette façon, vous serez en mesure de supprimer la leçon seul avec ttl.

  1. Cronjob/Planificateur

Utilisez un programmateur comme cron pour exécuter un travail toutes les quelques minutes/heures pour trouver dans des cours salles de classe avec des dates de péremption est dépassée et les supprimer à partir de lesson tableau.

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(); 

Pour la recherche expiresAt au sein de tableau de sous-document, vous pouvez utiliser l'opérateur $elemMatch, comme indiqué dans this exemple. Le seul inconvénient de la méthode 2 est que, selon l'intervalle de cronjob que vous choisissez, les leçons peuvent durer leurs dates d'expiration pendant quelques minutes supplémentaires.