47

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

db.log.events.ensureIndex( { "status": 1 }, { expireAfterSeconds: 3600 } )

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

4

5 回答 5

115

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

// expire docs 3600 seconds after createdAt
new Schema({ createdAt: { type: Date, expires: 3600 }});

注意:

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

这段代码对我有用。

有帮助吗

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

currentSchema.index({createdAt: 1},{expireAfterSeconds: 3600});
于 2017-08-14T10:44:17.940 回答
18

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

例如,这里我们设置expires2m(2 分钟),mongoose 会为我们转换为120 秒

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

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

需要注意的是,TTL 进程每 60 秒运行一次,因此它并不总是完全准时。

于 2018-09-28T22:14:27.897 回答
2

如果您正在使用 Mongodb Atlas Replica Sets - 请尝试:

import * as mongoose from 'mongoose'; 

let currentSchema = new mongoose.Schema({
        createdAt: { type: Date, expires: 10000, default: Date.now },
        id: String,
        name: String,
        packageId: Number,
        age: Number
        });

currentSchema.index({"lastModifiedDate": 1 },{ expireAfterSeconds: 10000 });
于 2020-04-16T14:09:40.637 回答
0

有一个 npm 库 - 'mongoose-ttl'。:

var schema = new Schema({..});
schema.plugin(ttl, { ttl: 5000 });

你可以看到这个库的所有选项: https ://www.npmjs.com/package/mongoose-ttl

于 2018-02-04T09:05:54.713 回答