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

Posted

技术标签:

【中文标题】使用 mongoose 在 mongodb 中设置集合的到期时间【英文标题】:Setting expiry time for a collection in mongodb using mongoose 【发布时间】:2013-01-13 20:52:17 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

在 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

【讨论】:

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 天吗? @AndiGiga 您可能想查看 mongo 文档:docs.mongodb.org/manual/tutorial/expire-data 如何在数组的特定元素中应用 ttl。我正在编写节点 API。我在字符串数组中保留令牌我想在指定的时间间隔后删除它们?? 那么如果我将expires设置为updatedAt,那么每次更新值后都会刷新计数? 我正在遵循这种方法,但是无论我指出多少秒,它都会在一分钟后删除文档。 cartSchema.index(createdAt: 1,expireAfterSeconds: 14400)【参考方案2】:

这段代码对我有用。

有帮助吗

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

currentSchema.index(createdAt: 1,expireAfterSeconds: 3600);

【讨论】:

当你设置 timestamps: true 然后 createdAt 将被自动添加到字段列表中。 @SadeghTeimouri 哪个字段会过期? 此集合中的每个文档,将在创建后 3600 秒后删除。 真的吗?它对我不起作用,我遵循了版本【参考方案3】:

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

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

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

【讨论】:

这个库的最新版本是 8 年前发布的。似乎维护得不好...【参考方案4】:

如果您不想处理过期时间计算并提高架构的整体可读性,则向 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 所以它并不总是完全准时。

【讨论】:

【参考方案5】:

如果您正在使用 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 );

【讨论】:

以上是关于使用 mongoose 在 mongodb 中设置集合的到期时间的主要内容,如果未能解决你的问题,请参考以下文章

在 mongodb 中设置假数据进行测试

如何在 Mongoose 中设置数据库名称和集合名称?

Mongoose:当要保存的文档中不存在时,在必填字段中设置默认值

在 @nestjs/mongoose 中设置 mongoose 全局选项

查询后在猫鼬对象中设置属性[重复]

查询后在猫鼬对象中设置属性[重复]