Сделать документы Mongodb неактивными через определенное время

#node.js #mongodb #mongoose

#node.js #mongodb #мангуст

Вопрос:

Допустим, я создаю веб-приложение, которое размещает маркеры событий на карте, чтобы помочь флешмобам узнать, где встретиться. В этом гипотетическом приложении и из-за характера флеш-мобов эти маркеры должны были бы стать неактивными через определенный интервал времени, чтобы не загрязнять карту событиями, которые больше не происходят. Мой вопрос в том, как правильно разрешить это в MongoDB с помощью node.js без удаления документа?

Если у меня есть модель мангуста (маркер), подобная этой:

 const mongoose = require('mongoose');

const markerSchema = new mongoose.Schema({
  name: {
    type: String,
  },
  description: {
    type: String,
    trim: true,
  },
  createdAt: {
    type: Date,
    default: Date.now(),
    select: false,
  },
  expiresAt: {
    type: Date
  },
  active: Boolean,
  location: {
    type: {
      type: String, 
      enum: ['Point'], 
      required: true,
    },
    coordinates: {
      type: [Number],
      required: true,
    },
  },
});

markerSchema.pre('save', function (next) {
  this.expiresAt = this.createdAt   60 * 60 * 1000 * 6;
  next();
});

const Marker = mongoose.model('Marker', tourSchema);

module.exports = Marker;
 

Каков наилучший способ обновить активное поле маркеров на false через произвольное время, скажем, через 6 часов?

Я исследовал TTL Mongodb, и я также рассмотрел возможность использования поля createdAt для запроса маркеров, которые находятся в пределах периода времени активного использования Marker.find({ expiresAt: {$ gt: Date.now() }), но я не знаю, будет ли это лучшим. Есть ли способ запустить функцию или промежуточное программное обеспечение, которое периодически проверяет каждый документ и устанавливает для активного поля значение false, если временные рамки истекли? Просто любопытно, как бы вы подошли к этой проблеме, чтобы запрос Marker.find({ active: true }) предоставил бы данные, которые я ищу.

Ответ №1:

Установка TTL в MongoDB запускает запланированную задачу каждые 60 секунд и удаляет документ по истечении срока действия. Если вы не хотите удалять документ и отмечать его вместо этого.

  1. Запускайте CRON / запланированную задачу каждую минуту
  2. Обновите документ, соответствующий вашим пользовательским критериям TTL
  3. Используйте критерии в предложении all select, чтобы игнорировать документы с истекшим сроком действия.

Ответ №2:

Вы можете использовать node-cron для достижения своей цели.

Например, удалять задание каждую минуту :

 cron.schedule('* * * * *', function() {
    console.log('running a task every minute');
});
 

Более подробная информация и полные примеры использования :