node.js - 在一定时间后使 Mongodb 文档处于非活动状态
问题描述
假设我正在创建一个 Web 应用程序,该应用程序将事件标记发布到地图上,以帮助快闪族找到聚会地点。在这个假设的应用程序中,由于快闪族的性质,这些标记必须在一定时间间隔后变为非活动状态,以免不再发生的事件污染地图。我的问题是,在不删除文档的情况下,使用 node.js 在 mongoDB 中允许这种情况发生的适当方法是什么?
如果我有一个像这样的猫鼬模型(标记):
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;
在任意时间(例如 6 小时)后将标记活动字段更新为 false 的最佳方法是什么?
我研究了 Mongodb 的 TTL,我还考虑过使用 createdAt 字段来查询使用 Marker.find({ expiresAt: {$gt: Date.now() }) 的活动时间范围内的标记,但我不知道如果这将是最好的。有没有办法运行一个函数或中间件来定期检查每个文档并在时间框架到时将活动字段设置为 false?只是好奇您将如何解决此问题,因此查询 Marker.find({ active: true }) 将提供我正在寻找的数据。
解决方案
在 MongoDB 中设置 TTL 每 60 秒运行一次计划任务,一旦过期将删除文档。如果您不想删除文档并标记它。
- 每分钟运行一次 CRON/计划任务
- 更新与您的自定义 TTL 条件匹配的文档
- 使用 all select 子句中的条件忽略过期文档。
推荐阅读
- css - Flexbox 没有按预期工作 - 项目越来越小
- git - 远程 ssh 密钥身份验证的权限错误:git 附件获取文件
- excel - 如何在 Excel VBA 工作表函数中添加多个 SUMIFS
- android - 在 android 设备上获取离线 GPS 坐标
- c# - 创建流利的api问题
- spring - @Transactional 方法中的@Transactional 方法调用(都具有默认传播)
- bash - 为什么 echo -n 在 Mac 上的 shell 中不起作用?
- javascript - 通过javascript从表单中读取格式化文本
- java - 二叉搜索树不会添加新节点?
- html - 更改 HTML 或 CSS 时,它们在页面上不可见