MongoDB - 更新 TTL 索引值
MongoDB - Updating TTL Index value
我正在尝试更新文档中到期日期的值。这是我每次要更新文档时用来设置索引的 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 中的索引,但我是在更新此处的索引吗?当我尝试更改值而不是索引本身时,是否有所不同?
你已经了解了 ttl 索引有点奇怪的方式...
在您的代码示例中,您将每个具有时间戳列 "expires_on" 的文档设置为立即过期 (expireAfterSeconds: 0).
过期进程是运行后台,如果您将expireAfterSeconds设置为0,它将找出所有"expires_on"值小于或等于now()的文档。
因此,您对字段 "expires_on" 的更新必须发生在 "now() -lt expires_on".
的时刻
最好说 f.ex。 "expireAfterSeconds: 3600" 然后将 expires_on 更新为值 "tomorrow minus that 3600 seconds"...
每次插入新数据时我都创建索引的事实是不合逻辑的。我在我的数据库中设置了一次索引并且每次只更新文档:
database.collection(collectionName).updateOne(query, update, { upsert: true }, (error, result) => {...})
然而,问题出在我在代码中为 expires_on
设置的值。由于 Node.js 的异步性,该值未正确计算。
我正在尝试更新文档中到期日期的值。这是我每次要更新文档时用来设置索引的 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 中的索引,但我是在更新此处的索引吗?当我尝试更改值而不是索引本身时,是否有所不同?
你已经了解了 ttl 索引有点奇怪的方式... 在您的代码示例中,您将每个具有时间戳列 "expires_on" 的文档设置为立即过期 (expireAfterSeconds: 0).
过期进程是运行后台,如果您将expireAfterSeconds设置为0,它将找出所有"expires_on"值小于或等于now()的文档。
因此,您对字段 "expires_on" 的更新必须发生在 "now() -lt expires_on".
的时刻最好说 f.ex。 "expireAfterSeconds: 3600" 然后将 expires_on 更新为值 "tomorrow minus that 3600 seconds"...
每次插入新数据时我都创建索引的事实是不合逻辑的。我在我的数据库中设置了一次索引并且每次只更新文档:
database.collection(collectionName).updateOne(query, update, { upsert: true }, (error, result) => {...})
然而,问题出在我在代码中为 expires_on
设置的值。由于 Node.js 的异步性,该值未正确计算。