以下命令可以通过mongo终端设置集合的到期时间(TTL):
db.log.events.ensureIndex( { "status": 1 }, { expireAfterSeconds: 3600 } )
如何使用mongoose从Node.js中的代码执行此操作?
答案 0 :(得分:73)
在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 }}
答案 1 :(得分:9)
这段代码对我有用。
可能会有所帮助
let currentSchema = mongoose.Schema({
id: String,
name: String,
packageId: Number,
age: Number
}, {timestamps: true});
currentSchema.index({createdAt: 1},{expireAfterSeconds: 3600});
答案 2 :(得分:3)
如果不想处理过期时间计算并提高架构的整体可读性,则为Mongoose很好地为expires
提供一个字符串。
例如,在这里我们将expires
设置为 2m (2分钟),猫鼬会为我们转换为 120秒:
var TestSchema = new mongoose.Schema({
name: String,
createdAt: { type: Date, expires: '2m', default: Date.now }
});
猫鼬会在后台创建一个索引,并将expireAfterSeconds
自动设置为120
秒(由 2m 指定) 。
重要的是要注意TTL处理runs once every 60 seconds,因此它并不总是按时完成的。
答案 3 :(得分:0)
有一个npm库 - ' mongoose-ttl&#39 ;.:
_getCacheCanvasDimensions: function() {
var zoom = this.canvas && this.canvas.getZoom() || 1,
objectScale = this.getObjectScaling(),
retina = this.canvas && this.canvas._isRetinaScaling() ? fabric.devicePixelRatio : 1,
dim = this._getNonTransformedDimensions(),
zoomX = objectScale.scaleX * zoom * retina,
zoomY = objectScale.scaleY * zoom * retina,
width = dim.x * zoomX,
height = dim.y * zoomY;
return {
// for sure this ALIASING_LIMIT is slightly crating problem
// in situation in wich the cache canvas gets an upper limit
width: width + ALIASING_LIMIT,
height: height + ALIASING_LIMIT,
zoomX: zoomX,
zoomY: zoomY,
x: dim.x,
y: dim.y
};
你可以看到这个库的所有选项: https://www.npmjs.com/package/mongoose-ttl
答案 4 :(得分:0)
如果您正在使用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 });