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 中没有任何文件。
到目前为止 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 中没有任何文件。