相关文章推荐
月球上的匕首  ·  c++ - ...·  2 年前    · 
礼貌的香菇  ·  Java8 Stream流 - ...·  2 年前    · 

本章介绍MongoDB的“生存时间”或 TTL 集合的功能。 通过TTL集合可以实现:在MongoDB中存储数据并让 mongod 在指定的秒数后或特定的时钟时间后自动删除数据。

数据到期对于某些类型的信息很有用,包括机器生成的事件数据、日志和会话信息,因为这些信息只需保留有限的时间即可。

特殊的 TTL索引属性 支持TTL集合的实现。 TTL功能依赖于mongod中的后台线程,该后台线程读取索引中日期类型的值,并从集合中删除过期的 文档

要创建 TTL索引 ,需要:

  1. 在值为日期或包含日期值的数组的字段上使用: db.collection.createIndex() 方法,
  2. 指定 expireAfterSeconds 选项。

TTL索引是单个字段索引。复合索引不支持TTL属性。有关TTL索引的更多信息,请参见 TTL索引

使用 collMod 命令修改现有TTL索引的expireAfterSeconds选项。

1.通过指定的秒数,使文档过期

想要从索引字段时间值起经过指定的秒数后使数据过期,可以在保存BSON日期类型的值或BSON日期类型的对象数组的 字段上创建 TTL 索引,并在expireAfterSeconds 中指定一个大于零的值。 从索引字段的时间值开始, expireAfterSeconds 中指定的秒数过去之后,文档将过期。 [1]

例如,下面的例子在 log_events 集合的 createdAt 字段上创建一个索引并把expireAfterSeconds的值指定为3600,将到期时间设置为createdAt指定的时间之后的一小时。

db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )

将文档添加到 log_events 集合时,请将 createdAt 字段设置为当前时间:

db.log_events.insert( {
   "createdAt": new Date(),
   "logEvent": 2,
   "logMessage": "Success!"

如果文档的createdAt值[1]大于expireAfterSeconds中指定的秒数时,MongoDB将自动从log_events集合中删除文档。

[1](1,2)如果该字段包含BSON日期类型对象的数组,则至少一个BSON日期类型对象中的一个大于expireAfterSeconds中指定的秒数时,数据将过期。

2.通过时钟时间,使文档过期

要使文档在特定的时钟时间过期,请:

  1. 首先在一个字段上创建TTL索引并指定expireAfterSeconds值为0(该字段保存BSON日期类型的值或BSON日期类型的对象的数组)。
  2. 然后对于集合中的每个文档,将索引日期字段值设置为文档应到期的时间值。如果索引日期字段包含过去的日期,则MongoDB认为文档已过期。

例如,以下操作在log_events集合的expireAt字段上创建索引,并将expireAfterSeconds值指定为0:

db.log_events.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )

对于每个文档,将expireAt的值设置为对应于文档应过期的时间。例如,以下insert()操作添加了一个文档,该文档应在2013年7月22日14:00:00到期。

db.log_events.insert( {
   "expireAt": new Date('July 22, 2013 14:00:00'),
   "logEvent": 2,
   "logMessage": "Success!"

当文档的expireAt值大于expireAfterSeconds中指定的秒数(即,在这种情况下早于0秒)时,MongoDB将自动从log_events集合中删除文档。这样,数据将以指定的expireAt值过期。

上一篇:TTL索引 

参考原文:https://docs.mongodb.com/manual/tutorial/expire-data/

Mongodb通常会被用来存储缓存数据或大尺寸、低价值的数据,对于这些类型的数据数据量往往非常大,如果不定期清理,不但会影响性能,也会浪费大量的系统资源。 Mongodb其实可以像Redis一样设置数据的过期时间,TTL索引MongoDB中一特殊的索引,可以支持文档在一定时间之后自动过期删除,目前TTL索引只能在单字段上建立。 当你在集合中某一个字段建立TTL索引后,后台会有一个单线程,通过不断查询(默认60s一次)索引的值来判断document是否有过期,并且删除文档的动作还依据mongod实例的负载情况,如果负载很高,可能会稍微延后一段时间再删除。 创建TTL索引方法: 和普通索引
类似Redis中的expire机制,MongoDB也可以设置过期自动删除的表。 MongoDB的过期设置依赖索引(TTL-index),设置过期字段使用的索引后,插入数据时在该字段指定日期时间, 经过在创建索引时指定的秒数后,该记录会被MongoDB认为已经过期,然后删除。 伴随数据量的增长和业务压力的增大,经常有接收到mongodb分片集群的性能告警邮件。 我所维护的几套分片集群有时一天能收到200来封告警邮件,不胜其烦。告警邮件大致分为三类: 1. cpu 负载过高。cpu load average 值超过30,cpu 使用率超过50%。 2. 空闲内存不足,系统对swap 分区使用超过50%。 3. IO
使用方法: db.Colloctions.ensureIndex({'date':1},{expireAfterSeconds:60})//date 为设置的索引,expireAfterSeconds为数据删除事件 MongoDB 透過mongod背景處理過期的資料https://docs.mongodb.com/manual/release-notes/2.2/,頻率為一分鐘一次。在建...
要删除 MongoDB 集合中的索引,你可以使用 `db.collection.dropIndex()` 命令。 例如,假设你有一个名为 "users" 的集合,并且你想删除名为 "age_1" 的索引,你可以使用以下命令: db.users.dropIndex("age_1") 如果你想删除集合中的所有索引,你可以使用 `db.collection.dropIndexes()` 命令。例如: db.users.dropIndexes() 注意:删除索引可能会导致数据库性能下降,因此应谨慎使用。
Anthony_zc: You can modify the file idea.exe.vmoptions or idea64.exe.vmoptions, which should be in the bin folder of your IDE installation. For linux version, it could be idea.vmoptions. You need to add there a parameter: -Duser.name=YOURNAME How to open the file: Ctrl+Shift+A > type "vm options" > select option Help > Edit custom VM options... 【MongoDB】对现有集合(collection)进行分片 如果按照我做的,应该可以分片呀。 【MongoDB】对现有集合(collection)进行分片 hahaqundao: 大佬,问一下,按照这个方法进行完之后为什么数据还是在一个分片上面啊