1

我正在尝试更新文档中到期日期的值。这是我每次想要更新文档时用来设置索引的 Node.js 代码:

database.collection(collectionName).createIndex({ "expires_on": 1 }, { expireAfterSeconds: 0 })
database.collection(collectionName).updateOne(query, update, { upsert: true }, (error, result) => {...})

问题是我将 expires_on 日期设置为明天的日期,并且该值在数据库中设置正确,但它会在几秒钟内到期。我更新此字段的方式有问题吗?我不知道如何更新此文档,使其在上次更新的 expires_on 日期过期。

我注意到您无法更新 MongoDB 中的索引,但我要在这里更新索引吗?当我尝试更改值而不是索引本身时,这不是不同吗?

4

2 回答 2

1

你已经理解了 ttl index 有点奇怪的方式......在你的代码示例中,你将每个具有时间戳列“expires_on”的文档设置为现在过期(expireAfterSeconds:0)。

过期进程正在后台运行,如果将 expireAfterSeconds 设置为 0,它将找出“expires_on”值小于或等于 now() 的所有文档。

因此,您对字段“expires_on”的更新必须发生在“now() -lt expires_on”的时刻。

最好说 f.ex。“expireAfterSeconds: 3600”,然后将 expires_on 更新为“明天减去 3600 秒”的值……

于 2020-04-29T04:24:29.093 回答
0

每次插入新数据时我都创建索引的事实是不合逻辑的。我在我的数据库中设置了一次索引,并且每次只更新文档:

database.collection(collectionName).updateOne(query, update, { upsert: true }, (error, result) => {...})

然而,问题原来是我expires_on在代码中设置的值。由于 Node.js 的异步性,该值计算不正确。

于 2020-05-12T12:45:25.247 回答