Установка времени истечения срока действия коллекции в mongodb с помощью mongoose

Ниже приведена команда, которую можно использовать через терминал mongo для установки срока действия коллекций (TTL):

db.log.events.ensureIndex( { "status": 1 }, { expireAfterSeconds: 3600 } )

Как мне сделать это из моего кода в Node.js с помощью мангуста?


person Amanda G    schedule 30.01.2013    source источник


Ответы (5)


В Mongoose вы создаете индекс TTL для поля Date с помощью свойства expires в определение схемы этого поля:

// expire docs 3600 seconds after createdAt
new Schema({ createdAt: { type: Date, expires: 3600 }});

Обратите внимание, что:

  • Задача срока действия данных MongoDB выполняется раз в минуту, поэтому документ с истекшим сроком может сохраняться до минуты после истечения срока его действия.
  • Для этой функции требуется MongoDB 2.2 или новее.
  • It's up to you to set createdAt to the current time when creating docs, or add a default to do it for you as suggested here.
    • { createdAt: { type: Date, expires: 3600, default: Date.now }}
person JohnnyHK    schedule 30.01.2013
comment
updateLogSchema = mongoose.Schema({ success: { type: Boolean, required: true }, saveDate: { type: Date, required: true, default: Date.now, expires: 60*60*24*7 #Every 7 days } }) Значит, я должен сделать это для одного свойства - даты? Что произойдет, если я обновлю свой документ и свой saveDate, он снова будет жить 7 дней? - person Andi Giga; 26.11.2015
comment
@AndiGiga, вы, вероятно, захотите просмотреть документы mongo: docs.mongodb.org/manual/ руководство / данные об истечении срока действия - person mooreds; 27.01.2016
comment
Как я могу применить ttl к определенным элементам массива. Я пишу API узла. Я сохраняю токен в строковом массиве. Я хочу удалить их по истечении указанного интервала времени? - person Sunil Sharma; 22.02.2016
comment
Итак, если я установлю истечение срока на updatedAt, тогда он будет обновлять счет каждый раз после обновления значения? - person Haven; 05.07.2016
comment
но тогда как я узнаю, когда он истек? где это в дб написано? - person dang; 16.11.2016
comment
Я следую этому подходу, однако независимо от того, сколько секунд я указываю, он удаляет документ через одну минуту. cartSchema.index({createdAt: 1},{expireAfterSeconds: 14400}) - person George Cscnt; 29.06.2018
comment
это решение не работает, и в документации Mongoose нет упоминания об этом подходе. Используйте подход, описанный здесь: docs.mongodb.com/manual/tutorial/expire-data - person Nick; 24.02.2019
comment
@Nick Документация по этой функции в Mongoose находится здесь. Это работает, но вам нужно удалить любой существующий индекс в поле, чтобы Mongoose мог его создать. - person JohnnyHK; 24.02.2019
comment
@JohnnyHK в своем OP вы используете эту строку: new Schema({ createdAt: { type: Date, expires: 3600 }});, которая, насколько я тестировал, не работает и не упоминается в документации. Структура, упомянутая в документации - new Schema({ date: { type: Date, index: { unique: true, expires: '1d' }}) - действительно может работать. - person Nick; 25.02.2019
comment
@Nick Я только что попробовал вашу схему createdAt с Mongoose 5.1.4, и срок действия работал правильно. Можете ли вы опубликовать новый вопрос, если у вас все еще есть проблемы с ним? - person JohnnyHK; 25.02.2019

этот код работает для меня.

может это помочь

let currentSchema = mongoose.Schema({
    id: String,
    name: String,
    packageId: Number,
    age: Number
}, {timestamps: true});

currentSchema.index({createdAt: 1},{expireAfterSeconds: 3600});
person Sadegh Teimori    schedule 14.08.2017
comment
когда вы установите {timestamps: true}, то createdAt будет автоматически добавлен в список полей. - person Sadegh Teimori; 29.08.2017
comment
@SadeghTeimouri, у какого поля истечет срок действия? - person Ashh; 11.05.2018
comment
каждый документ в этой коллекции будет удален через 3600 секунд после его создания. - person Sadegh Teimori; 11.05.2018
comment
В самом деле? у меня не работает, следил за версиями - person Aljohn Yamaro; 29.11.2020

Предоставление строки для expires также хорошо работает с Mongoose, если вы не хотите иметь дело с расчетом времени истечения срока действия и улучшить общую читаемость схемы.

Например, здесь мы устанавливаем expires на 2m (2 минуты), и мангуст преобразует для нас в 120 секунд:

var TestSchema = new mongoose.Schema({
  name: String,
  createdAt: { type: Date, expires: '2m', default: Date.now }
});

Mongoose создаст индекс в фоновом режиме и автоматически установит expireAfterSeconds на 120 секунд (задано 2m).

Важно отметить, что процесс TTL выполняется раз в 60 секунд, поэтому не всегда вовремя.

person Akrion    schedule 28.09.2018

Если вы работаете с наборами реплик Mongodb Atlas Replica Sets - попробуйте:

import * as mongoose from 'mongoose'; 

let currentSchema = new mongoose.Schema({
        createdAt: { type: Date, expires: 10000, default: Date.now },
        id: String,
        name: String,
        packageId: Number,
        age: Number
        });

currentSchema.index({"lastModifiedDate": 1 },{ expireAfterSeconds: 10000 });
person Jason Mullings    schedule 16.04.2020

Есть библиотека npm - mongoose-ttl .:

var schema = new Schema({..});
schema.plugin(ttl, { ttl: 5000 });

вы можете увидеть все параметры этой библиотеки: https://www.npmjs.com/package/mongoose-ttl

person arr    schedule 04.02.2018
comment
Последняя версия этой библиотеки вышла 8 лет назад. Кажется, не в хорошем состоянии ... - person kamatheuska; 14.11.2020