到目前为止 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/