Erstellen Sie einen bedingten TTL in mongo
Gibt es eine Besondere Aufgabe, die ich erreichen will , aber ich bin nicht auf der Suche nach einer bestimmten Art und Weise zu tun.
Können sagen, ich habe eine app, die verwendet wird zum senden von mails. Ich halte Rekord von diese E-Mail ist in einer Sammlung in mongo. Und mit dieser app kann ich E-mail senden jetzt oder planen, können mails für die Zukunft.
Die Struktur der Dokumente in der Sammlung ist wie :
{
'_id' : 123456789,
'to_email' : '[email protected]'
'from_email' : '[email protected]'
'subject': 'some subject'
'type' : '<1 if normal and 2 if scheduled>',
'createdDate' '<date when mail was sent or the request was created>',
'scheduledDate' : '<time for which mail is scheduled>'
.. and many more key-value pairs
}
Den scheduledDate Feld kann null sein, oder ein beliebiges Datum, je nachdem, ob Ihre geplante oder nicht.
Ich will nicht zu halten, Daten die älter als 2 Tage sind, so habe ich eine TTL-index auf "createdDate", für 2 Tage.
Aber ich habe auch nicht wollen, zum löschen von Zeilen oder Anträge, die geplant sind für die Zukunft.
Ich war auf der Suche nach irgendeiner Art von bedingten TTL, konnte aber nicht finden, eine solche Lösung.
Gibt es alles, was wie bedingte TTL oder andere Weise zu tun itin mongodb.
Ich möchte erstellen Sie eine TTL, die arbeiten wie :
if(requestType!=2 and createdDate < -2days)
delete row;
oder gibt es eine Möglichkeit, wo ich änderungen vornehmen können, um bestimmte Dokumente mit jeder Sprache, so dass Sie dont get abgelaufen.
EDIT : habe das Problem gelöst, indem gleiche Werte für scheduledDate und requestDate im Falle von geplanten E-mails.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als von MongoDB 3.2, ist es auch möglich, eine teilweise TTL-index mit einem filter-Ausdruck angegeben. Im Falle dass, wenn Sie entfernen müssen, nur normal nicht geplante E-Mails, könnten Sie Folgendes verwenden:
Beachten Sie, dass
partialFilterExpression
hat Beschränkungen für mögliche filter-Bedingungen: https://docs.mongodb.com/manual/core/index-partial/Ich möchte nur hinzufügen, dass ein anderes Feld. Es ist nicht viel Daten:
Hinzufügen eines TTL-index von 0 Sekunden bis die expires-Feld. Nicht noch eine TTL zu den anderen Terminen.
Die folgenden Beispiele sind in Mungo (ein ORM für Knoten), aber die Ideen sollten auf welchem framework man verwendet:
Ein default-Wert
Könnte man hinzufügen, ein default-Wert expires-Feld mit dem Wert 'erstellt Datum + 2 Tage.
Ein anderes Ablaufdatum für Ihre geplanten Aufgaben
Setzen Sie einfach das Datum explizit:
Oder ändern Sie die Funktion, die setzt den Standard-Wert:
Keine Ablauf auf allen
Setzen Sie das Feld auf NULL:
Diese Weise haben Sie die Möglichkeit, wählen Sie einen anderen Ablauf für normale E-Mails, wichtige E-Mails, geplante diejenigen, usw. Wenn Sie auf Zeit, Sie können sogar die
expires
- Feld auf NULL zu kündigen, die automatische Löschung.Die einzige Einschränkung ist, dass wenn Sie änderungen in der geplanten Zeit, Sie müssen aktualisieren, die expires-Feld.
db.emails.createIndex( { "expires": 1 }, { expireAfterSeconds: 0 } )
expires
Feld (geben oder nehmen Sie sich eine minute).Können Sie einfach erstellen Sie eine TTL-index auf
scheduledDate
, wenn der Wert null ist, wird es nicht gelöscht werden. Nach der Dokumentation, wenn das indizierte Feld in einem Dokument nicht ein Datum oder ein array, das hält ein Datum, Wert(E) wird, wird das Dokument nicht ab.Mit Mongo 3.2 habe ich überprüft das ist in der Tat der Fall mit diesem test collection:
Wenn Sie mit dieser Kollektion alle
new Date()
Einträge entfernt , in der Erwägung, dass der erste Datensatz mit dem Wert null bleibtscheduledDate
mit der Idee, dass Sie nur entfernt werden sollte, Aufzeichnungen, nachdem Sie erfolgreich versendet wurden, ansonsten haben Sie einen Blick auf RikkusRikkus Lösung,