Mongoose - 如何根据另一个字段更改 TTL?

Mongoose - How to change the TTL based on another field?

如何根据架构中的另一个字段设置 TTL?我想将 expireAt 字段设置为 accountType 的任何值(值可以是一个月/一周/一天)。但是,此代码不会使文档过期或更改过期日期。我已经尝试了 TTL 字段的多种变体,但它似乎不起作用。

import mongoose from 'mongoose'
import { generateKey } from '../lib/generateKey'

const KeySchema = new mongoose.Schema({
  key: {
    type: String,
    default: generateKey,
    required: true,
  },
  accountType: { /* The value can be a month, a week or a day*/
    type: String,
    required: true,
  },
  dailyLimit: {
    type: Number,
    default: 0,
    required: true,
  },
  expireAt: {
    type: Date,
    default: Date.now,
    index: {
      expireAfterSeconds: 60
    }
  },
})

KeySchema.pre('save', function (next) {
  switch (this.accountType) {
    case 'month':
      this.expireAt.index = {
        expires: 60 * 60 * 24 * 30
      }
      break
    case 'week':
      this.expireAt.index = {
        expires: 60 * 60 * 24 * 7
      }
      break
    case 'day':
      this.expireAt.index = {
        expires: 60 * 60 * 24 * 1
      }
      break
  }

  next()
})

export default mongoose.models.Key || mongoose.model('Key', KeySchema)

我试过了 createdAt: { type: Date, expires: 600 }, KeySchema.index({ createdAt: 1 }, { expireAfterSeconds: 3600 }) expireAt: { type: Date, default: Date.now, index: { expires: '5s' }}

MongoDB 使用 index

处理 TTL

Mongoose 在创建所有其他索引的同时基于架构创建 TTL 索引,并且所有文档都使用相同的索引。

虽然可以有基于字段值的部分索引,MongoDB 不允许创建包含相同键但不同选项(如过期)的多个索引。

与其尝试改变每个文档的索引选项 expireAfterSeconds,不如将另一个字段添加到名为 deleteAt 的方案中,并将 expireAfterSeconds 设置为 0,然后在 pre-save 函数根据 expireAtaccountType 字段的值设置 deletedAt