mongodb固定集合、TTL集合

在数据量较少的情况下,或者只需要保存部分的数据,使用固定集合不失为一个比较好的选择。

  • 插入、查询的速度非常快。

创建固定集合

  • 有点类似数据结构中的循坏队列,先进先出方式。满队列删除原来的元素。
  • 固定集合与普通集合有所不同,需要显示的创建,指定size,max参数。当其中某个条件满足,将会删除最先进来的元素。
db.createCollection(“test_log”,{capped:true,size:2,max:2}) 
查看索引: 
 mongos> db.test_log.getIndexes() 
 [ 
 { 
 “v” : 1, 
 “key” : { 
 “_id” : 1 
 }, 
 “name” : “id“, 
 “ns” : “admin.test_log” 
 } 
 ]
  • 自然排序的方式,在mongodb3.0以上默认采用_id作为索引。
  • 也可以自定义索引。

转换为固定集合

  • 普通集合可以通过 convertToCapped将普通集合转为固定集合
db.runCommand({convertToCapped:”test_2”,size:10,max:3})
  •  但是固定集合的特点是:
     不能进行分区,因为它本身就是不是针对大数据集合的,所以,也许这个时候可以考虑使用TTL索引。

TTL集合

通过创建TTL索引,就构建了一个TTL集合,索引建立的原则:
- 索引字段必须为时间类型
- 在本地上进行测试,进行多个分片,片键选择为key1+timeKey,成功分片。
- 确保数据保存在一定范围内,其实主要是后台有一个线程,平均60s执行一次,对超期的数据进行删除。所以,这部分也有性能的损耗,需要权衡。

建立语句:

db.ttl_test.ensureIndex({“time”:1},{expireAfterSeconds:20}})

设置其为20s后删除数据,真实情况下可能并不能精确到20s.

选择

对于大数据量来说,希望只保存几个月的数据,固定集合与TTL貌似都是对数据进行的限制。但是固定集合无法精确到具体的时间,文档的条数与文档大小都不能确定。主要是固定集合无法分片,对于需要经常查询的可能就不是太合适。
当然仅仅保存log文件,查看最新的log还是不错的选择