mongodb 每个文档都有不同的 TTL

标签 mongodb ttl

到目前为止 i know ,目前 mongodb TTL 由 expireAfterSeconds 索引管理,它是为集合中的所有文档设置的。

那么是否有任何内置方法可以将过期设置为单个文档?,谢谢

最佳答案

在每个文档上,您可以设置一个字段 expires并创建以下索引:

db.docs.createIndex( { expires:1 }, {expireAfterSeconds: 0 } );

一旦时间超过过期字段,此集合中的文档将被删除。但是,这可能需要 60 秒,因为运行以删除文档的后台任务每 60 秒运行一次。

不过这里有一个例子......

因此,让我们插入一堆文档,每次添加它们时为每个文档增加 60 秒。

> var expires = new Date(); // Gets the current datetime.
> expires.setSeconds(expires.getSeconds() + 60)
1587812623023
> db.docs.insert({expires})
WriteResult({ "nInserted" : 1 })

> expires.setSeconds(expires.getSeconds() + 60)
1587812683023
> db.docs.insert({expires})
WriteResult({ "nInserted" : 1 })

> expires.setSeconds(expires.getSeconds() + 60)
1587812743023
> db.docs.insert({expires})
WriteResult({ "nInserted" : 1 })

> db.docs.find()
{ "_id" : ObjectId("5ea418de00f07c4d6461090b"), "expires" : ISODate("2020-04-25T11:03:43.023Z") }
{ "_id" : ObjectId("5ea418e300f07c4d6461090c"), "expires" : ISODate("2020-04-25T11:04:43.023Z") }
{ "_id" : ObjectId("5ea418e600f07c4d6461090d"), "expires" : ISODate("2020-04-25T11:05:43.023Z") }

现在,如果我们添加 TTL 索引。

db.docs.createIndex( { expires:1 }, { expireAfterSeconds: 0 } )

然后我们可以每 60 秒监控一次我们的集合并查看每个文档被删除。

> new Date()
ISODate("2020-04-25T11:03:28.278Z")
> db.docs.find()
{ "_id" : ObjectId("5ea418de00f07c4d6461090b"), "expires" : ISODate("2020-04-25T11:03:43.023Z") }
{ "_id" : ObjectId("5ea418e300f07c4d6461090c"), "expires" : ISODate("2020-04-25T11:04:43.023Z") }
{ "_id" : ObjectId("5ea418e600f07c4d6461090d"), "expires" : ISODate("2020-04-25T11:05:43.023Z") }

尚未删除任何内容。

> new Date()
ISODate("2020-04-25T11:04:18.652Z")
> db.docs.find()
{ "_id" : ObjectId("5ea418e300f07c4d6461090c"), "expires" : ISODate("2020-04-25T11:04:43.023Z") }
{ "_id" : ObjectId("5ea418e600f07c4d6461090d"), "expires" : ISODate("2020-04-25T11:05:43.023Z") }

一份文件不见了。

> new Date()
ISODate("2020-04-25T11:05:17.705Z")
> db.docs.find()
{ "_id" : ObjectId("5ea418e600f07c4d6461090d"), "expires" : ISODate("2020-04-25T11:05:43.023Z") }

另一个没了。

> new Date()
ISODate("2020-04-25T11:06:31.390Z")
> db.docs.find()
>

我们的收藏中没有任何文件。

关于mongodb 每个文档都有不同的 TTL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61424043/

相关文章:

lua - 我将使用什么命令使 Redis 中的 key 过期,这些 key 的生存时间少于 5 天?

Azure 虚拟机 : too frequent DNS lookup [TTL 60]

javascript - 如何在 Meteor 中只允许插入和更新某些文档字段?

MongoDB 按名称对数组中的项目进行计数

ethernet - 为什么以太网帧中没有 TTL 字段?

java - Aerospike TTL 监听器

java - Spring Redis缓存实现

c# - 了解 MongoDB Aggregate 和 GroupBy

java - 如何在 BasicDBObject 中插入/放置 json 数组

javascript - meteor 收集.allow