【MongoDB权威指南】四

四 特殊索引和特殊集合

固定集合

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。目前来说没啥了解的欲望,有需要的时候再看。

Buy Me A Coffee / 捐一杯咖啡的钱
分享这篇文章~
0%
//