db.log_events.insert( {
"expireAt": new Date('July 22, 2013 14:00:00'),
"logEvent": 2,
"logMessage": "Success!"
expireAt 的值为特定的时间值,等时间到达expireAt的值时,这个文档就 失效了。
pymongo
由于自己使用python进行mongodb的使用,程序如下
1 设置文档在66秒后过期。
from pymongo import MongoClient
import pymongo
import datetime
client = MongoClient("10.168.99.118", 27017)
collection = client.test.expire
collection.create_index([("time", pymongo.ASCENDING)], expireAfterSeconds=66)
data = {
"one": 1,
"two": 235,
"time": datetime.datetime.utcnow(),
collection.insert(data)
2 设置特定时间
from pymongo import MongoClient
import pymongo
import datetime
client = MongoClient("10.168.99.118", 27017)
collection = client.test.expire
collection.create_index([("time", pymongo.ASCENDING)], expireAfterSeconds=0)
data = {
"one": 1,
"two": 235,
"time": datetime.datetime.utcnow()+ datetime.timedelta(seconds=66),
collection.insert(data)
注意,上面的时间使用的是datetime.datetime.utcnow() 而不是 datetime.datetime.now(), 这两者的时间是有差别的,数据存入mongodb的客户端中可以看得到。
现在时间是 2017-02-09 14:36
第一条数据使用 datetime.datetime.utcnow() 的时间
第二条数据使用 datetime.datetime.now() 的时间
所以,第二条数据会在晚上 10点多才会过期。
mongoengine
自己使用的Django中的数据库也是mongodb。
from mongoengine import *
import datetime
import time
connect('test', host='10.168.99.118', port=27017)
class Session(Document):
created = DateTimeField(default=datetime.datetime.utcnow()-datetime.timedelta(seconds=60))
last = DateTimeField(default=datetime.datetime.utcnow())
num = IntField(unique=True)
count = IntField(default=0)
meta = {
'indexes': [
{'fields': ['created'], 'expireAfterSeconds': 66}
s = Session.objects(num=51)
if len(s)>0:
print(s[0].count)
else:
b = s[0]
b.num = 51
b.count = 2
b.save()
修改成特定时间过期的方式与pymongo中的类似。
参考文档:
python - Mongodb TTL expires documents early
http://www.itgo.me/a/8424428520865988282/mongodb-ttl-expires-documents-early
MongoDB自动删除过期数据–TTL索引
http://blog.csdn.net/jianlong727/article/details/54631124
Time To Live(TTL) 集合MongoDB 2.2 引入一个新特性–TTL 集合,TTL集合支持失效时间设置,或者在某个特定时间, 集合自动清除超时文档,者用来保存一个诸如session会话信息的时候非常有用。如果想使用TTL集合,用用到 expireAfterSeconds 选项mongo官网使用文档设置方法:Expire Documents after a Specified Nu
1.今天要做一个验证码一样的东西,让用户通过校验。
下面这段是设置以createTime为过期时间的索引,意思就是一条数据以其中createTime的字段时间为准,超过该字段时间将这条数据删除。
{expireAfterSeconds:0} 设置为0 时间一到立马删除。
{ expireAfterSeconds: 60*2 } 设置延时秒,以设置的延时秒为准,到时间以设置的延时为基准删除数...
由于公司业务需求,对于3个月前的过期数据需要进行删除动作,以释放空间和方便维护
本来想的是使用crontab写个脚本定时执行,但是看到Mongo本身就有自动删除过期数据的功能,所以还是用一下吧
这个方法就是使用TTL索引,后续我再写一个脚本定时删除的任务
TTL索引是MongoDB中一种特殊的索引, 可以支持文档在一定时间之后自动过期删除,目前TTL索引只能在单字段上建立
最近由于公司业务需求,对于3个月前的过期数据需要进行删除动作,以释放空间和方便维护
本来想的是使用crontab写个脚本定时执行,但是看到Mongo本身就有自动删除过期数据的功能,所以还是用一下吧
这个方法就是使用TTL索引,后续我再写一个脚本定时删除的任务,关于TTL索引的更多使用实例,大家可以参考学习这篇文章:https://www.jb51.net/article/126810.htm
TTL索引是MongoDB中一种特殊的索引, 可以支持文档在一定时间之后自动过期删除,目前TTL索引只能在单字段上建立,并且字段类型必须是date类型或者包含有date类型的数组
固定集合是具**有固定大小**的循环集合,遵循插入顺序,以支持高性能的创建、读取和删除操作。通过循环,当分配给集合的固定大小用完时,它将删除集合中最旧的文档,而不提供任何显式命令。
TTL 索引是特殊的单字段索引,MongoDB 可以使用它在一定时间或特定时钟时间后自动从集合中删除文档。
在工作过程中,我们难免会遇到这样的问题,我们想保存一些数据,但是我们对这些数据的要求并不高,有时候往往只是想要某个时间范围内的数据,比如我们如果永远只关心从当前时间往前推半年内的数据特性,那么我们就不需要将所有数据都保存起来,因为不仅浪费磁盘空间,而且随着数据量的不断累积,其他性能也会受到影响。
这时候我们迫切的需要一直方法能够在我们插入数据的时候自动的帮我们去删除我们过一段时间就不想要的数据,
Document document = new Document();
document.append("createTime",1);
IndexOptions indexOptions = new IndexOptions();
indexOptions.expireAfter(300L,TimeUnit.SECONDS);
Mongodb设置自动删除过期数据
db.log_events.createIndex( { "Time": 1 }, { expireAfterSeconds: 0 } ) (单位秒)
Time 字段名,expireAfterSeconds 单位:秒