mongodb 每个文档的 TTL 不同

mongodb different TTL for every document

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

那么有什么内置的方法可以为单个文档设置过期时间吗?谢谢

在每个documet上你可以设置一个字段expires并创建如下索引:

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

此 collection 中的文档将在时间超过过期字段后被删除。但是,这可能需要 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 秒监控一次 collection 并查看每个文档是否被删除。

> 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()
>

我们的 collection 中没有任何文件。