【问题标题】:MongoDB NodeJS always expiring after one minuteMongoDB NodeJS 总是在一分钟后过期
【发布时间】:2020-06-01 21:53:35
【问题描述】:

我在我的节点应用程序中使用MongoDB npm 模块,我有这段代码可以在集合中创建一个带有TTL index 的新对象:

var utcDate = new Date();
var emailObj = {email: emailAddress, createdAt: utcDate};
dbo.collection("initialEmail").createIndex({ "createdAt": 1 }, { expireAfterSeconds: 3600 });
dbo.collection("initialEmail").insertOne(emailObj, function(err, response) {
    ...
});

但是,条目总是在大约一分钟后删除(而不是我设置的 1 小时)。

我从我的研究中得知,mongo 运行它的脚本来删除大约每个one minute。这让我觉得由于某种原因我的 mongo 服务器时区与我的节点服务器时区不同,因此使创建的对象的 mongo 过期时间比当前 mongo 服务器时间早一个小时。

对于utcDate变量,我试过了:

  • new Date( moment.utc().format() );
  • new Date( moment().valueOf() );
  • new Date(Date.now() - new Date().getTimezoneOffset() * 60 * 1000);

但是没有效果。所有这些都使对象在大约 1 分钟后删除。

我也试过了:(对于utcDate

  • moment().valueOf();
  • Date.now() - new Date().getTimezoneOffset() * 60 * 1000;

但是这些导致createdAt 在将对象视为 JSON 时的类型为 int,并且该对象永远不会被删除(即使在预期到期后等待了几分钟)。

如何确保插入的对象始终持续至少一个小时?

【问题讨论】:

    标签: node.js mongodb timezone momentjs utc


    【解决方案1】:

    我正在使用 docker-compose,带有官方的 mongo 图像。我切换回var utcDate = new Date();,并猜测可能不知何故,docker 图像出于某种原因保存了索引,很久以前,我将expireAfterSeconds 的值设置为 60。因为它没有“change the value of expireAfterSeconds of an existing index”我的值一定还是 60。

    我删除了图像并再次运行docker-compose up,它成功了。

    我根本没有使用 docker 卷,所以我认为 mongo 图像每次都会是一个全新的构建。 Docker镜像中数据的半持久化我不是很了解,所以如果你明白为什么数据库集合索引属性从一个up保存到另一个,请评论和教育我。

    【讨论】:

      猜你喜欢
      • 2021-04-13
      • 2011-04-30
      • 2017-08-06
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多