capped-collections官网:https://www.mongodb.com/docs/v4.4/core/capped-collections/
MongoDB固定集合(Capped Collections)是性能出色且有着固定大小的集合。我们可以将其想成一个环形队列,当集合空间用完后,在插入的元素就会覆盖最初是的头部元素。另外这里说的大小固定其实有有两个含义:① 存储空间大小有上限 ②文档数有上限。实际使用时触发其中任何一个上限都会引发前面说的覆盖。
capped collections 在创建时要预先指定大小。如果空间用完,新添加的对象将会取代集合中最旧的对象。
总结:固定集合是具有固定大小的循环集合,遵循插入顺序,以支持高性能的创建、读取和删除操作。通过循环,当分配给集合的固定大小用完时,它将删除集合中最旧的文档,而不提供任何显式命令。
和标准的collection不同,你必须要显式的创建一个capped collection,
指定一个collection的大小,单位是字节。collection的数据存储空间值提前分配的。
要注意的是指定的存储大小包含了数据库的头信息。
> db.createCollection("myLogCollection", {capped:true, size:100000})
固定集合很像环形队列,如果空间不足就会覆盖最早的文档。由此可见固定集合适应于任何想要自动淘汰过期属性的场景。例如:日志文件、最近通话记录、最近联系人、最近聊天记录等。
如果更新导致文档大小增加,则固定集合会限制对文档的更新。由于固定集合是按磁盘存储的顺序存储文档的,因此可以确保文档大小不会增加磁盘上分配的大小。
固定集合最适合存储日志信息、缓存数据或任何其他高容量数据。
要创建一个具有固定大小的集合,我们可以使用常规的 createCollection 命令,但需要将 capped 选项设置为 true,并以字节为单位设置集合的大小。
> db.createCollection("myLogCollection", {capped:true, size:10000})
{ "ok" : 1 }
其中 bianchengbang 为要创建的集合名称。除了集合的大小外,我们还可以使用 max 参数来限制集合中文档的数量:
> db.createCollection("myLogCollection", {capped:true, size:10000, max:1000})
{ "ok" : 1 }
如果要检查集合是否为固定集合,可以使用 isCapped 命令:
> db.myLogCollection.isCapped()
true
如果您需要将已经存在的集合转换为固定集合,可以使用如下命令:
> db.runCommand({"convertToCapped":"myLogCollection",size:10000})
{ "ok" : 1 }
上面的命令可以将我们已存在的集合“myLogCollection”转换为固定集合。
检查集合是否为固定集合,可以使用 isCapped 命令
#切换到xxx库
use xxx;
db.xxx.isCapped();
不同于普通集合,固定集合必须在使用前显式创建。
固定集合中不存在默认索引,甚至在 _id 字段上也不存在;
默认情况下对一般的 collection 是创建索引的,但不会对 capped collection 创建。
在插入新文档时,MongoDB 实际上不必在磁盘上寻找容纳新文档的位置,它可以在集合的尾部盲目地插入新文档,这使得在固定集合中插入文档非常快;
在查询文档时,MongoDB 返回的文档顺序与文档在磁盘上存储的顺序是相同的,这使得查询文档的速度非常快。
官网:https://www.mongodb.com/docs/v4.4/core/index-ttl/
MongoDB自动删除过期数据–TTL索引
https://www.cnblogs.com/guxuanqing/p/13732306.html
作为有上限的集合的另一种选择,考虑MongoDB的TTL(生存时间)索引。如通过设置TTL使集合中的数据过期,这些索引允许您根据日期类型字段的值和索引的TTL值从普通集合中过期并删除数据。
TTL 索引
官网:https://www.mongodb.com/docs/v4.4/core/index-ttl/
TTL 索引是特殊的单字段索引,MongoDB 可以使用它在一定时间或特定时钟时间后自动从集合中删除文档。数据过期对于某些类型的信息很有用,例如机器生成的事件数据、日志和会话信息,这些信息只需要在数据库中保留有限的时间。
当你在集合中某一个字段建立TTL索引后,后台会有一个单线程,通过不断查询(默认60s一次)索引的值来判断document是否有过期,
并且删除文档的动作还依据mongod实例的负载情况,如果负载很高,可能会稍微延后一段时间再删除。
例如,要在集合lastModifiedDate
字段上创建一个 TTL 索引eventlog,TTL 值为3600秒
db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
createIndex()
更改现有索引的expireAfterSeconds
值。要更改现有索引选项的值,您必须先删除索引并重新创建。