>db.log_events.createIndex( { "createTime": 1 }, ---字段名称
{ expireAfterSeconds: 60*60 } ) ---过期时间(单位秒)
>db.log_events.getIndexes() ---查看索引
"v" : 1,
"key" : {
"_id" : 1
"name" : "_id_",
"ns" : "tt.t1"
"v" : 1,
"key" : {
"createTime" : 1
"name" : "createTime_1",
"ns" : "tt.t1",
"expireAfterSeconds" : 3600
修改TTL索引的expireAfterSeconds属性值:
注:如果想更改过期时间expireAfterSeconds,可以使用collMod方法,要不然你只能只用dropIndex(),createIndex()方法重建索引了,我想这样的方法在亿级数据量下是很头疼的
db.runCommand( { collMod: "log_events", ---集合名
index: { keyPattern: { createTime: 1 }, ---createTime为具有TTL索引的字段名
expireAfterSeconds: 7200 ---修改后的过期时间(秒)
虽然上面的方法可以实现自动过期删除,但是如果白天业务很忙,频繁的删除数据势必会增加负载,所以我想着晚上定时删除过期数据(如果晚上业务量少的话)
方法如下:
增加一个expireTime字段(用于指定过期时间),expireAfterSeconds属性值设置为0,
注:上面的createTime字段就不需要再有TTL索引了,这个expireTime的时间就需要在插入时指定上
>db.log_events.createIndex( { "expireTime": 1 }, ---字段名称
{ expireAfterSeconds: 0 } ) ---过期时间(单位秒)
>db.log_events.insert( {
"expireTime": new Date('Jan 22, 2016 23:00:00'), ---此文档将在2016-1-22的23点自动删除
"logEvent": 2,
"logMessage": "Success!"} )
④你不能使用createIndex()去更改已经存在的TTL索引的expireAfterSeconds值,如果想更改expireAfterSeconds,可以使用collMod命令,
否则你只能删除索引,然后重建了
⑤你不能在已有索引的字段上再创建TTL索引了,如果你想把非TTL索引改为TTL索引,那就只能删除重建索引了
Mongodb设置
自动删除过期数据
db.log_events.createIndex( { "Time": 1 }, { expireAfterSeconds: 0 } ) (单位秒)
Time 字段名,expireAfterSeconds 单位:秒
1.今天要做一个验证码一样的东西,让用户通过校验。
下面这段是设置以createTime为过期时间的索引,意思就是一条数据以其中createTime的字段时间为准,超过该字段时间将这条数据删除。
{expireAfterSeconds:0} 设置为0 时间一到立马删除。
{ expireAfterSeconds: 60*2 } 设置延时秒,以设置的延时秒为准,到时间以设置的延时为基准删除数...
固定集合是具**有固定大小**的循环集合,遵循插入顺序,以支持高性能的创建、读取和删除操作。通过循环,当分配给集合的固定大小用完时,它将删除集合中最旧的文档,而不提供任何显式命令。
TTL 索引是特殊的单字段索引,MongoDB 可以使用它在一定时间或特定时钟时间后自动从集合中删除文档。
在工作过程中,我们难免会遇到这样的问题,我们想保存一些数据,但是我们对这些数据的要求并不高,有时候往往只是想要某个时间范围内的数据,比如我们如果永远只关心从当前时间往前推半年内的数据特性,那么我们就不需要将所有数据都保存起来,因为不仅浪费磁盘空间,而且随着数据量的不断累积,其他性能也会受到影响。
这时候我们迫切的需要一直方法能够在我们插入数据的时候自动的帮我们去删除我们过一段时间就不想要的数据,
MongoDB提供了TTL(time to live)索引,可以自动删除过期的数据。当创建一个TTL索引时,需要指定一个过期时间,MongoDB会在指定的时间后自动删除过期的数据。可以使用MongoDB的watch()方法来监听过期数据的删除事件。当一个过期数据被删除时,watch()方法会返回一个删除事件,可以在回调函数中处理该事件。需要注意的是,watch()方法只能在MongoDB 4.0及以上版本中使用。以下是一个监听过期数据的示例代码:
const MongoClient = require('mongodb').MongoClient;
const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri, { useNewUrlParser: true });
client.connect(err => {
const collection = client.db("test").collection("data");
const filter = { operationType: 'delete' };
const options = { fullDocument: 'updateLookup' };
const changeStream = collection.watch([ { $match: filter } ], options);
changeStream.on('change', (change) => {
console.log(change);