Mongoose 是在 Node.js 中使用 MongoDB 的一个对象模型工具,能够以一种简洁明了的方式处理 MongoDB 的数据。Mongoose 的文档过期机制,可以在指定时间后自动删除文档,这在一些需要自动清理数据的场景下非常有用,如会话过期、缓存清理等。
如何使用 Mongoose 中的文档过期机制
在 Mongoose 中,通过设置 Schema 和 Model 的 expireAfterSeconds 选项来启用文档过期机制。该选项表示文档的存活时间,单位为秒。在指定的时间过后,文档将自动被删除。
例如,这里有一个表示会话的模型:
// Session 模型 const sessionSchema = new mongoose.Schema({ userId: { type: mongoose.Schema.Types.ObjectId, required: true }, expiresAt: { type: Date, default: Date.now, expires: 0 }, data: mongoose.Schema.Types.Mixed })
这个模型中定义了一个 expiresAt 字段,它是一个 Date 类型的字段,并设置了 expires 选项为 0,表示文档过期时间为 0 秒。当然,您也可以设置 expires 选项为其他数值来表示文档过期的时间。
需要注意的是,如果您在 expiresAt 字段上设置了默认值,文档过期时间会以默认值为基准,而非当前时间为基准。所以,要使 expiresAt 字段的默认值为当前时间,需要将默认值设置为 Date.now
。
文档过期的定义必须使用到索引,因为过期操作是通过 MongoDB 的索引来完成的。在定义 Schema 时需要添加 {expires: '指定的过期时间'},例如一个表示会话的模型:
// Session 模型 const sessionSchema = new mongoose.Schema({ _id: String, data: Object }, { timestamps: true, typeKey: '$type', minimize: false }); // 过期时间为一小时 sessionSchema.index({ createdAt: 1 }, { expireAfterSeconds: 60 * 60 });
在该模型中,使用 sessionSchema.index
方法来创建索引,并设置 expireAfterSeconds 参数为了文档的过期时间。如上设置后,如果一个会话文档没有更新或删除,则会在创建后的一个小时之后自动过期并删除。
案例分析:会话过期清理
会话过期清理是一个非常实用的场景。网站通常需要记录用户登录状态,会话数据会在用户登录成功后自动生成,之后用户每一次的操作都会更新会话数据。在程序中,做法通常是记录用户的请求时间,通过比较请求时间和上一次更新时间来确定会话是否过期,如果过期就清除会话数据。
使用 Mongoose 的文档过期机制可以实现更加简便、自动化的清理方式。下面是一个简单的例子,使用 Mongoose 的 Schema 和 Model API来创建会话模型和会话对象:
-- -------------------- ---- ------- ----- -------- - ------------------- ----- ------------- - --- ----------------- ------- ------- ---------- - ----- ----- -------- --------- -------- - -- ----- --------------------------- -- ----- ------- - ------------------------- -------------- -- ---- ----- ------- - ----- ---------------- ------- ---- ----- - ------ ----------- ------- ---- - --展开代码
其中的 expiresAt 字段是一个 Date 类型的字段,它的默认值为 Date.now,expires 选项的值为 0。因此,这个会话的过期时间是文档创建时间。在过期时间到达后,Mongoose 会自动将这个文档删除。
下面是一个示例代码,演示了如何使用 Mongoose 的文档过期机制来清理过期的会话:
// 清理过期的会话 Session.deleteMany({ expiresAt: { $lte: new Date() } })
其中,$lte 运算符表示小于等于。上述代码会删除所有 expiresAt 值小于等于当前时间戳的会话。
小结
本文简要介绍了 Mongoose 的文档过期机制,使用 Mongoose 的文档过期机制可以轻松自动化清理过期文档,节省开发者的时间和精力。同时,我们也根据一个简单的案例分析了如何使用 Mongoose 实现会话过期清理,说明了其在实际应用中的具体使用方法。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d5c2cea941bf7134af8c04