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

时间:2013-01-30 05:22:08

标签: node.js mongodb mongoose

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

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

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

5 个答案:

答案 0 :(得分:73)

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

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

请注意:

  • MongoDB的数据到期任务每分钟运行一次,因此过期的文档可能会在到期后的一分钟内持续存在。
  • 此功能需要MongoDB 2.2或更高版本。
  • 您可以在创建文档时将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 });