以下是可通过 mongo 终端设置集合到期时间(TTL)的命令:
db.log.events.ensureIndex( { "status": 1 }, { expireAfterSeconds: 3600 } )
如何使用 mongoose 从 Node.js 中的代码执行此操作?
在 Mongoose 中,您可以通过该字段的架构定义中的属性在该Date
字段上创建一个 TTL 索引:expires
// expire docs 3600 seconds after createdAt
new Schema({ createdAt: { type: Date, expires: 3600 }});
注意:
createdAt
为当前时间,或者按照此处default
的建议添加一个为您执行此操作。
{ createdAt: { type: Date, expires: 3600, default: Date.now }}
这段代码对我有用。
有帮助吗
let currentSchema = mongoose.Schema({
id: String,
name: String,
packageId: Number,
age: Number
}, {timestamps: true});
currentSchema.index({createdAt: 1},{expireAfterSeconds: 3600});
expires
如果您不想处理过期时间计算并提高架构的整体可读性,那么提供一个字符串也可以很好地与 Mongoose 配合使用。
例如,这里我们设置expires
为2m(2 分钟),mongoose 会为我们转换为120 秒:
var TestSchema = new mongoose.Schema({
name: String,
createdAt: { type: Date, expires: '2m', default: Date.now }
});
Mongoose 会在后台创建一个索引,并expireAfterSeconds
在这种情况下自动设置为120
秒(由2m指定)。
需要注意的是,TTL 进程每 60 秒运行一次,因此它并不总是完全准时。
如果您正在使用 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 });
有一个 npm 库 - 'mongoose-ttl'。:
var schema = new Schema({..});
schema.plugin(ttl, { ttl: 5000 });
你可以看到这个库的所有选项: https ://www.npmjs.com/package/mongoose-ttl