如何配置 Mongodb 模式以使用另一个集合中的 TTL 属性自动删除集合中的 mongodb 记录

问题描述 投票:0回答:1

我将 Nestjs 与 Mongodb 一起使用,并希望在 TTL 过期后自动从 api-hit 日志集合中删除记录。我知道如何使用 expiresAfterSeconds 配置自动删除记录的模式,但场景是:

  • 集合中的每条记录都有不同的 TTL。
  • 每条记录的 TTL 属性都存在于另一个集合中。
  • 例如的通用标识符是两个集合中的“用户名”属性。

具有常量“expireAfterSeconds”的 TTL 配置。

Const mongoose = require(‘mongoose’)
Const userSchema = new mongoose.Schema({
{
createdOn: {
type: Date,
required: true
},
.
.
.
}, {timestamps: true})

**userSchema.index({createdOn: 1}, {expireAfterSeconds: 3600});**

但我想要的是动态配置“expireAfterSeconds”,如下所示(每个记录应该有不同的 TTL)

**userSchema.index({createdOn: 1}, {expireAfterSeconds: dynamicTTL});**

请为上述亲爱的开发人员提供解决方案!

mongodb auto-delete
1个回答
0
投票

TTL索引可以相同,将expiryAfterSeconds设置为0,如下所示。

userSchema.index({createdOn: 1}, {expireAfterSeconds: 0});

然后在创建 api-hit-log 文档时针对用户调整“createdOn”。创建访问日志时,必须针对当前用户查询日志过期设置集合,并获取保留时间并用于计算文档的createdOn。

例如假设今天为两个用户 u1 和 u2 创建了两个日志条目。根据业务需要,u1和u2的保留时间分别为1天和2天。

log expiry time : access time + retention time (in seconds)
log expiry time for user u1 = 24.04.2024 14HH:00:00 + (60 * 60 * 24 * 1) = 25.04.2024 14HH:00:00
log expiry time for user u2 = 24.04.2024 16HH:00:00 + (60 * 60 * 24 * 2) = 26.04.2024 16HH:00:00

请参考类似的问答。 在特定时钟时间使文档过期

© www.soinside.com 2019 - 2024. All rights reserved.