四 特殊索引和特殊集合
固定集合
MongoDB中的非特殊集合是动态创建的,可以自动增长容量。而另一种集合——固定集合则需要事先创建,大小是固定的。往一个已经满了的固定集合里面插入数据,会覆盖最老的数据。
固定集合中的数据是被顺序写入的,非随机访问比较快。
一般用来存放日志。
创建
1 | db.createColletion('collction_name', {'capped': true, 'size': 100000, 'max': 100}) |
上面的例子中,size指集合所占空间大小,max指文档最大个数。
一旦创建之后就不能改变大小了,除非删掉重建。
出了凭空创建出固定集合以外,还可以通过转换非固定集合来创建固定集合。
下面这段代码把名为test的数据库转为固定集合:
1 | db.runCommand({'convertToCapped': 'test', 'size': 10000}) |
自然排序
磁盘中的存放顺序为自然顺序。若为普通集合,自然排序没有任何意义,因为它的新数据插入未必在最后面,有可能会插在中间每个空位。而对于固定集合来说,新数据永远插在最后(循环列表),所以按照自然排序可以拿到一个按照插入时间排序的数据。
1 | db.test.find().sort({'$natural': 1}) |
循环游标
只能用于固定集合。
没有_id的集合
固定集合是没有_id索引的,如果普通集合也不想要_id,创建集合的时候可以指定{'autoIndexId': false}
。当然创建固定集合的时候也可以用这个选项。
_id必须是唯一索引。它一旦被建立就无法删除,所以要想要再建立。如果建立的_id有问题,就只能删除集合再重建了。
TTL索引
time-to-live index,具有生命周期的索引。允许为每个文档设置一个超时时间,使得当一个文档达到预设值的老化条件之后就会被删除。
1 | db.test.ensureIndex({'lastUpdated': 1}, {'expireAfterSecs': 60*60*24}) |
如果文档存在lastUpdated字段并且是日期类型,那么当服务器时间比文档时间晚expireAfterSecs秒时,文档会被删除。
MongoDB每分钟才检测一次TTL,注意检测单位不是秒。
TTL索引可以被当作普通索引来用,能提高sort性能。
全文本索引
创建文本索引的开销非常大,所以最好在数据库空闲的时候创建,而且内存可能会不够用。
使用上可能会有严重的性能问题,因为所有字符串都需要被分解、分词,并保存到一个地方。
地理空间索引
对位置坐标进行索引。
1 | db.world.ensureIndex({'loc': '2dsphere'}) |
作用是啥呢,比如说找到所有在某个区域内的点,或者找到所有距离符合条件的点。这里不细说。
存储大型二进制文件
这个技术叫GridFS。目前来说没啥了解的欲望,有需要的时候再看。