【问题标题】:MongoDB documents expiring too soon (mongoose)MongoDB 文档过期太快(猫鼬)
【发布时间】:2019-03-04 14:55:20
【问题描述】:

我将到期时间设置为 24 小时,但文件在大约 5-10 分钟后到期(我没有准确计时)。我究竟做错了什么?我的架构:

const collectionSchema = new mongoose.Schema({
  userId: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User"
  },
  name: {
    type: String,
    maxLength: 30,
    required: true
  },
  entries: [{ type: mongoose.Schema.Types.ObjectId, ref: "Entry" }],
  expireAt: { type: Date, expires: 60 * 60 * 24 }
});

在发布路线中,我有条件地设置日期,以便登录的客户端获得数据持久性。

router.post("/", auth, async (req, res) => {
  let date = null;
  if (!req.user) {
    date = new Date();
  }
  try {
    const collection = {
      userId: req.body.userId,
      name: req.body.name,
      expireAt: date
    };
    const newCollection = await Collection.create(collection);
    res.send(newCollection);
  } catch (error) {
    res.send(error.message);
  }
});

我以为我遇到了时区问题,但是当我检查 MongoDB 指南针中的时间戳时,它与我的时区匹配。我做错了什么?

【问题讨论】:

  • 您是否将数据存储到远程服务器?
  • 您能否更新您的问题以在 shell 中显示此集合的 getIndexes() 输出?

标签: mongodb mongoose ttl


【解决方案1】:

我对此进行了测试:

var TestSchema = new Schema({
  name: String,
  createdAt: { type: Date, expires: '2m', default: Date.now }
});

文档在第二分钟后被删除,我还确认正确创建了 TTL 索引(默认情况下作为背景索引),TTL 为 120 秒。

试试那个时间格式,看看是否适合你。

另请注意,通过您的 mongo 架构对索引进行的任何预期更改都不会反映,直到 您手动删除以前的索引并启动您的应用程序 自动创建新的。

MongoDB 版本:3.6.5

【讨论】:

  • 这似乎奏效了。我所做的只是将密钥的名称从“expiresAt”更改为“createdAt”。我想这个名字很重要。
  • 太棒了。如果此回复对您有所帮助,请考虑将其标记为答案,以便其他人可以更轻松地找到它。谢谢!
猜你喜欢
  • 2021-05-16
  • 1970-01-01
  • 2017-12-03
  • 2017-10-08
  • 1970-01-01
  • 2020-08-12
  • 2014-05-29
  • 2021-02-11
  • 1970-01-01
相关资源
最近更新 更多