Mongoose удаляет все документы каждую минуту и ​​не принимает время из `expires` и` expireAfterSeconds` - PullRequest
0 голосов
/ 13 июня 2019

Мы используем экспресс и мангуст, мы пытаемся удалить документ каждые 1000 секунд в фоновом режиме, но MongoDB удаляет в неожиданное время.как это решить?Также хотелось бы узнать разницу между expires и expireAfterSeconds.

MongoDB - v3.6.5, mongoose - 5.4.3, экспресс - 4.16.4

Пример модели:

const mongoose = require('mongoose');
mongoose.set('useCreateIndex', true);

const forgotPassword = mongoose.Schema({
    email: { type: String, required: [true, 'Email field is required']},
    expiresAt: { type: Date, expires: '2m', default: Date.now }
}, { timestamps: true, versionKey: false, strict: false });

forgotPassword.index({ expiresAt: 1 }, { expireAfterSeconds : 1000 });
module.exports = mongoose.model('forgotpassword', forgotPassword);

1 Ответ

0 голосов
/ 13 июня 2019

И истекает, и expireAfterSeconds использует Индекс TTL :

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

Ожидается, что ваши документы будут удалены от 2 до 3 минут.

UPDATE

Проверьте, имеет ли коллекция правильные индексы. Mongoose не обновляет индексы, если в коллекции они уже есть.

Если срок действия был равен 0 при первом создании индекса, документы будут удалены в течение минуты, независимо от того, какие изменения вы вносите в код js, до тех пор, пока вы не удалите индекс, коллекцию или всю базу данных.

Используйте syncIndexes для обновления индексов на стороне базы данных, но будьте осторожны, чтобы это не происходило часто на производстве. Это может быть довольно дорого в больших коллекциях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...