【发布时间】:2013-01-13 20:52:17
【问题描述】:
以下是可通过 mongo 终端设置集合到期时间(TTL)的命令:
db.log.events.ensureIndex( { "status": 1 }, { expireAfterSeconds: 3600 } )
如何使用 mongoose 从 Node.js 中的代码执行此操作?
【问题讨论】:
以下是可通过 mongo 终端设置集合到期时间(TTL)的命令:
db.log.events.ensureIndex( { "status": 1 }, { expireAfterSeconds: 3600 } )
如何使用 mongoose 从 Node.js 中的代码执行此操作?
【问题讨论】:
在 Mongoose 中,您可以通过该字段的架构定义中的 expires 属性在 Date 字段上创建一个 TTL 索引:
// expire docs 3600 seconds after createdAt
new Schema({ createdAt: { type: Date, expires: 3600 }});
注意:
createdAt 设置为当前时间,或者按照here 的建议添加default 为您执行此操作。
{ createdAt: { type: Date, expires: 3600, default: Date.now }}【讨论】:
updateLogSchema = mongoose.Schema({ success: { type: Boolean, required: true }, saveDate: { type: Date, required: true, default: Date.now, expires: 60*60*24*7 #Every 7 days } }) 所以我必须在一个日期属性上执行此操作?如果我更新我的文档和我的 saveDate 会发生什么,它还能再活 7 天吗?
updatedAt,那么每次更新值后都会刷新计数?
cartSchema.index({createdAt: 1},{expireAfterSeconds: 14400})
这段代码对我有用。
有帮助吗
let currentSchema = mongoose.Schema({
id: String,
name: String,
packageId: Number,
age: Number
}, {timestamps: true});
currentSchema.index({createdAt: 1},{expireAfterSeconds: 3600});
【讨论】:
有一个 npm 库 - 'mongoose-ttl'.:
var schema = new Schema({..});
schema.plugin(ttl, { ttl: 5000 });
你可以看到这个库的所有选项: https://www.npmjs.com/package/mongoose-ttl
【讨论】:
如果您不想处理过期时间计算并提高架构的整体可读性,则向 expires 提供字符串也可以很好地与 Mongoose 配合使用。
例如,这里我们将expires 设置为2m(2 分钟),猫鼬会为我们转换为120 秒:
var TestSchema = new mongoose.Schema({
name: String,
createdAt: { type: Date, expires: '2m', default: Date.now }
});
Mongoose 会在后台创建一个索引并自动将 expireAfterSeconds 设置为在这种情况下为 120 秒(由 2m 指定)。
重要的是要注意 TTL 进程 runs once every 60 seconds 所以它并不总是完全准时。
【讨论】:
如果您正在使用 Mongodb Atlas 副本集 - 请尝试:
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 });
【讨论】: