使用mongoose在mongodb中设置集合的到期时间

Ama*_*a G 34 mongoose mongodb node.js

以下是可以通过mongo终端设置集合的到期时间(TTL)的命令:

db.log.events.ensureIndex( { "status": 1 }, { expireAfterSeconds: 3600 } )
Run Code Online (Sandbox Code Playgroud)

如何使用mongoose从Node.js中的代码执行此操作?

Joh*_*yHK 79

在Mongoose中,您可以Date通过该字段expires的架构定义中的属性在字段上创建TTL索引:

// expire docs 3600 seconds after createdAt
new Schema({ createdAt: { type: Date, expires: 3600 }});
Run Code Online (Sandbox Code Playgroud)

注意:

  • MongoDB的数据到期任务每分钟运行一次,因此过期的文档可能会在到期后的一分钟内持续存在.
  • 此功能需要MongoDB 2.2或更高版本.
  • 您可以createdAt在创建文档时设置为当前时间,default也可以按照此处的建议添加一个为您执行此操作的时间.
    • { createdAt: { type: Date, expires: 3600, default: Date.now }}

  • 因此,如果我将 expires 设置为 `updatedAt`,那么它会在每次更新值后刷新计数? (2认同)
  • 我正在遵循这种方法,但是无论我指示的秒数如何,它都会在一分钟后删除文档。`cartSchema.index({createdAt: 1},{expireAfterSeconds: 14400})` (2认同)

Sad*_*ori 12

这段代码对我有用.

可能有帮助

let currentSchema = mongoose.Schema({
    id: String,
    name: String,
    packageId: Number,
    age: Number
}, {timestamps: true});

currentSchema.index({createdAt: 1},{expireAfterSeconds: 3600});
Run Code Online (Sandbox Code Playgroud)

  • 当您设置{timestamps:true}时,createdAt将自动添加到字段列表中. (7认同)
  • 真的吗?它对我不起作用,我遵循了版本 (4认同)

Akr*_*ion 5

expires如果您不想处理过期时间计算并提高架构的整体可读性,则提供一个字符串也可以与Mongoose很好地配合使用。

例如,在这里我们将设置expires2m(2分钟),猫鼬对我们来说将转换为120秒

var TestSchema = new mongoose.Schema({
  name: String,
  createdAt: { type: Date, expires: '2m', default: Date.now }
});
Run Code Online (Sandbox Code Playgroud)

猫鼬会在后台创建一个索引,并expireAfterSeconds在这种情况下自动将设置为120秒(2m指定)。

重要的是要注意,TTL过程每60秒运行一次,因此并不总是很准时。