首页 > 解决方案 > 在一定时间后使 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 }) 将提供我正在寻找的数据。

标签: node.jsmongodbmongoose

解决方案


在 MongoDB 中设置 TTL 每 60 秒运行一次计划任务,一旦过期将删除文档。如果您不想删除文档并标记它。

  1. 每分钟运行一次 CRON/计划任务
  2. 更新与您的自定义 TTL 条件匹配的文档
  3. 使用 all select 子句中的条件忽略过期文档。

推荐阅读