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 函数根据 expireAt
和 accountType
字段的值设置 deletedAt
。
如何根据架构中的另一个字段设置 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
处理 TTLMongoose 在创建所有其他索引的同时基于架构创建 TTL 索引,并且所有文档都使用相同的索引。
虽然可以有基于字段值的部分索引,MongoDB 不允许创建包含相同键但不同选项(如过期)的多个索引。
与其尝试改变每个文档的索引选项 expireAfterSeconds
,不如将另一个字段添加到名为 deleteAt
的方案中,并将 expireAfterSeconds
设置为 0,然后在 pre-save 函数根据 expireAt
和 accountType
字段的值设置 deletedAt
。