2017-06-29 3 views
1

Ich habe folgendes Schema für ein virtuelles Klassenzimmer in Mungo:Wie kann ich ein Filialdokument zu einem bestimmten Zeitpunkt in Mungo ablaufen lassen?

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

Ich mag jede Lektion aus dem Klassenzimmer verfallen nach theer endDate bestanden hat. Wie kann ich TTLs in Filialdokumente in Mungo verwenden?

Antwort

1

Ein Teil des Dokuments kann nicht mit ttl gelöscht werden. Ich kann als Behelfslösung von zwei anderen Optionen denken:

  1. Referenz

Nehmen Sie lesson seine eigene Sammlung und legen classroom_id darin als Verweis auf Klassenzimmer. Auf diese Weise können Sie die Lektion alleine mit ttl entfernen.

  1. Cronjob/Scheduler

Verwenden Sie einen Scheduler wie cron einen Job alle paar Minuten/Stunden laufen in Klassenzimmer Unterricht zu finden, mit Ablaufdaten ihnen vorbei und entfernen von lesson Array.

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

Für expiresAt innerhalb des Arrays von Subdokument suchen Sie $elemMatch Operator verwenden können, wie in this Beispiel gezeigt.

Der einzige Nachteil der Methode 2 besteht darin, dass die Lektionen, abhängig vom gewählten Cronjob-Intervall, ihre Verfallsdaten für einige zusätzliche Minuten bestehen lassen.

Verwandte Themen