#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 секунд и удаляет документ по истечении срока действия. Если вы не хотите удалять документ и отмечать его вместо этого.
- Запускайте CRON / запланированную задачу каждую минуту
- Обновите документ, соответствующий вашим пользовательским критериям TTL
- Используйте критерии в предложении all select, чтобы игнорировать документы с истекшим сроком действия.
Ответ №2:
Вы можете использовать node-cron
для достижения своей цели.
Например, удалять задание каждую минуту :
cron.schedule('* * * * *', function() {
console.log('running a task every minute');
});
Более подробная информация и полные примеры использования :