mongodb Mongoose架构是否设置了删除文档的到期日期字段?

j2cgzkjk  于 2023-02-11  发布在  Go
关注(0)|答案(4)|浏览(116)

我想在文档创建3分钟后删除它。定义文档创建时间的字段是expiresAt。这是我迄今为止的设置。文档在3分钟后没有删除,因为它应该删除。

const mongoose = require('mongoose')

const Schema = mongoose.Schema

const PostsAmountsTimeframesSchema = new Schema({
  posts_amounts_timeframe: Number,
  expireAt: {
      type: Date,
      default: new Date()
  },
  userid: {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'User',
      required: true
  },
})


PostsAmountsTimeframesSchema.index( { expireAt: 1 }, { expireAfterSeconds: 180 } )

const PostsAmountsTimeframes = mongoose.model('PostsAmountsTimeframes', PostsAmountsTimeframesSchema)

module.exports = PostsAmountsTimeframes

也尝试过

expireAt: {
      type: Date,
      default: new Date(),
      expires: 180,
  }

相同的结果。
PS:这是在服务器上创建文档的方式:

PostsAmountsTimeframes.create({
      userid: req.session.userId,
      posts_amounts_timeframe: req.session.posts_amounts_timeframe,
      // expireAt: d
  }, (error, postsamountstimeframes) => {
      console.log(error)
})
r55awzrz

r55awzrz1#

溶液

  • 删除整个集合
  • 删除集合上的所有索引
  • 将代码更改为:
const mongoose = require('mongoose')
//Create empty Schema object?
const Schema = mongoose.Schema

//Models are defined through the Schema interface
//Models define collections
const PostsAmountsTimeframesSchema = new Schema({
  posts_amounts_timeframe: Number,
  expireAt: {
      type: Date,
  },
  userid: {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'User',
      required: true
  },
})

PostsAmountsTimeframesSchema.index({ expireAt: 1 }, { expireAfterSeconds: 0 });
//Access the database my_database via mongoose.model.
//The first argument: The name of the collection the model is for.
//Apply the model to the collection?
const PostsAmountsTimeframes = mongoose.model('PostsAmountsTimeframes', PostsAmountsTimeframesSchema)
//Export User variable to other files
module.exports = PostsAmountsTimeframes

使用此创建条目。我使用当前日期后3分钟过期收集。

var d = new Date()
  d.setMinutes(d.getMinutes()+3);
  var r = new Date(d)

    PostsAmountsTimeframes.create({
      userid: req.session.userId,
      posts_amounts_timeframe: req.session.posts_amounts_timeframe,
      expireAt: r
    }, (error, postsamountstimeframes) => {
      console.log(error)
    })
  • 关闭mongosh
  • 关闭Mongo指南针
  • 重建项目
  • 重新运行项目
  • 创建一个条目,然后砰的一声,它会在创建条目时自动删除自己。

应该有一种方法来做同样的事情与过期TTL。工作的方法,目前!

nom7f22z

nom7f22z2#

我最近不得不使用mongoose(参见gist)创建一个TTL索引。我没有使用“default”选项,但我认为您的示例应该可以工作

expireAt: {
    type: Date,
    default: new Date(),
    expires: 180,
}

这段带有“expires”的代码将为您创建一个mongo TTL索引,其值为"expireAfterSeconds" : 180,这正是您想要实现的。
Mongo TTL索引将认为文档在expireAt值+ expireAfterSeconds秒后过期。
有一点你没有提到的是mongo最终删除过期条目的方式:后台mongo作业将需要0到60秒来检测和删除它们:cf蒙古文件:
删除过期文档的后台任务每60秒运行一次。因此,在文档过期和后台任务运行之间的这段时间内,文档可能会保留在集合中。

tp5buhyn

tp5buhyn3#

这段代码应该可以:

const PostsAmountsTimeframesSchema = new Schema({
  posts_amounts_timeframe: Number,
  expireAt: {
      type: Date,
      expires: "3m", default: Date.now
  },
  userid: {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'User',
      required: true
  },
})
yeotifhr

yeotifhr4#

const yourSchema = new mongoose.Schema({ expireAt: { type: Date, default: Date.now() + (1000*60*60*24) // for 1 day } })// 1000为1秒,默认值为到期时的实际值

相关问题