在特定时间删除MongoDB文档

时间:2016-07-20 04:03:45

标签: node.js mongodb mongoose

我正在考虑在特定时间删除文件。

const TestSchema = new Schema({
 expire_at: {
 type: Date,
 },
}, {
 timestamps: true,
});
TestSchema.index({expire_at: 1}, {expireAfterSeconds: 0});

POST

const test = new TestSchema(this.request.body);
  test.expire_at = test.end_time;

  try {
    yield test.save();
  } catch (error) {
    this.status = 409;
    this.response.body = error.errors;
    return;
  }

  this.response.body = test;
  this.status = 201;

似乎文件在expire_at中指定的时间删除。

我正在使用此日期格式:2016-07-20T05:01:19.567Z

5 个答案:

答案 0 :(得分:14)

这将在两小时内删除文档:

const TestSchema = new Schema({
    expire_at: {type: Date, default: Date.now, expires: 7200} 
})

//expired in 2 hours

答案 1 :(得分:7)

要在特定时间删除MongoDB文档,您可以使用 TTL(生存时间) TTL 索引是MongoDB可以用来在一定时间后自动从集合中删除文档的特殊单字段索引。

所以你需要创建一个TTL索引,如:(mongo shell命令)

db.yourCollecName.createIndex({"expire_at": 1 }, { expireAfterSeconds: 5 } );

或者您可以使用mongoose来创建此索引

TestSchema.createIndex({"expire_at": 1 }, { expireAfterSeconds: 5 } );

然后每隔60秒检查一次mongodb,如果expire_at日期时间小于当前日期时间,则此记录将在5秒后删除。

  

TTL索引不保证将删除过期数据   到期后立即。时间a之间可能会有延迟   文档过期以及MongoDB从中删除文档的时间   数据库。

     

删除过期文档的后台任务每60个运行一次   秒。因此,文档可能会在期间保留在集合中   文件到期和运行之间的时间段   后台任务。

<强> TTL Indexes

注意:使用createIndex代替index

答案 2 :(得分:3)

删除过程在60秒后运行。 因此,在删除时间过后,文档可以存在59秒。

答案 3 :(得分:2)

正如Amit所说,TTL索引不能保证在到期时删除数据;过期数据的后台任务将每60秒运行一次。

后台任务也可能受到性能争用和工作负载的影响,这可能导致数据远远超出此窗口:

  

删除过期文档的后台任务每60个运行一次   秒。因此,文档可能会在期间保留在集合中   文件到期和运行之间的时间段   后台任务。

     

因为删除操作的持续时间取决于工作负载   你的mongod实例,过期数据可能存在超过一段时间   背景任务运行之间的60秒时间。

Source

答案 4 :(得分:0)

const otpSchema = new mongoose.Schema({
   
    // other fields

    // expiry date of the document
    expire_at: {
        type: Date,
        default: Date.now(),
        expires: 60
    }
}, { timestamps: true })

otpSchema.index({ "expire_at": 1 }, { expireAfterSeconds: 5 });

这件事在我使用猫鼬时对我有用。只需添加一个标题为“expire_at”的额外字段并将索引添加到架构中。剩下的一切都由mongodb自己管理。