十、特殊的索引和集合

1、固定集合
MongoDB中普通集合是动态创建的,可以自动增长容纳更多的数据,那么固定集合满了会怎么样呢?
它会删除最老的文档,添加进来新的文档。
固定集合存储为蝶式磁盘,所以写入速度会非常快,尤其是集合拥有专有磁盘时(不会因为其他集合的一些随机性的写操作而中断)
~创建固定集合
db.createCollection("my_collection",{"capped":true,"size":100000,"max":100})
创建一个叫my_collection,大小为100000字节的集合,最多可容纳100个文档的
在建立固定集合时要考虑清楚他的大小,因为后期要变动大小是变动不了的,只能,删除重建
可以将常规集合转换为固定集合
db.runCommand({"covertToCapped":"test","size":10000})
但是没办法将固定集合转换为常规集合
~自然排序
对固定集合可以进行一种特殊的排序叫做自然排序
对于非固定的集合来说,自然排序并没什么用,因为位置经常变换,但是对于固定集合来说插入顺序就是自然顺序
如果从新到旧的顺序排序
db.my_collection.find.sort({"$natural":-1})
~循环游标
循环游标只能用于固定集合中,跟tail -f是一个原理,基本上就是在不断的提取新的结果,如果游标不关闭时,有新的文档插入集合中时,就会提取新的结果
~没有_id索引的集合
在创建索引的时候也可以不建立_id,对于一个只插入操作的集合来说,是很快的
db.createCollection("collection",{"autoIndexId":false})
这种集合是不能复制的,因为复制是需要每个文档都有_id索引的
固定集合默认是没有_id索引的
2、TTL索引(time-to-live时间推迟索引)
因为固定文档中只要空间满了,如果再插入新文档,旧的文档就会被删除,但是这个索引就是用来设定我大概什么时间想让他删除,如果不想删除还可以在更新当前文档的时间,用来把删除时间推迟。
比如举个例子:
db.foo.ensureIndex({"date":1},{"expireAfterSeconds":60*60*24})
date必须是一个时间,在服务器时间比date时间晚expireAfterSecs秒的时候,就会执行删除操作
MongoDB会每分钟对TTL索引进行一次清理。
如果要变更expireAfterSecs中的时间
db.runCommand({"collMod":"someapp.cache","expireAfterSeconds":3600})
遗留问题,这个并没有删除,可能是我时间格式不对?
3、全文本检索
全文检索就是说我可以根据我集合中拥有的任何一个字符串进行搜索
先开启全文检索
db.posts.adminCommand({"setParameter":1,"textSearchEnabled":true})
创建全文索引
db.posts.ensuredIndex({"title":"text"})

全文检索很变态,用时需谨慎
这个跟其他索引相比,可能会导致严重的性能问题,可能会导致MongoDB过载。
~当然这个全文检索也可以加上一些查询条件
~优化全文检索
*用查询条件将结果的范围变小,可以创建一个复合索引,也就是局部的全文本搜索
db.e.ensureIndex({"date":1,"post":text})
*也可以使用其他查询条件后缀
db.e.ensureIndex({"post":"text","data":1})
*前缀后缀一起用
*全文本索引自动开启usePowerOf2Sizes(关于这个是什么,可以参考一下第六节里面的总结)选项,这样可以控制空间的分配方式,所以不要禁用他。
~自动分词机制
在MongoDB中,language自动是设置为English的,它会自动以English的分词机制,也可以修改
db.e.insert({"username":"swedishChef","profile":"Bork and bork","language":"swedish"})
这样可以给每个文档指定语言
4、地理空间索引
~2dsphere
用于地球表面类型的模型
允许用GeoJSON格式指示点,线,多边形。同志们有不知道GeoJSON是什么的,可以上网叮一下
先往集合中加几个文档
表示点的
{ "name":"New York City", "loc":{ "type":"point", "coordinates":[50,2] } }
表示线的
{"name":"Hudson River","loc":{"type":"LineString","coordinates":[[0,1],[0,2],[1,2]]}}
多边点的
{"name":"New England","loc":{"type":"Polygon","coordinates":[[0,1],[0,2],[1,2]]}}
多边形这个有点烦,没弄出来。
loc这个名字是可以自己制定的,但是里面的子对象是由GeoJSON来定的
先自己创建一个2dsphere索引


可以使用多种不同类型的地理空间查询,交集,包含,以及接近
*相交
复合地理空间索引$geoIntersects
var eastVillage = { "type":"Polygon", "coordinates":[ [-73.9917900,40.7264100], [-73.9917900,40.7321400], [-73.9829300,40.7321400], [-73.9829300,40.7264100] ]}
db.open.street.map.find( {"loc":{"$geoIntersects":{"$geometry":eastVillage}}} )
注:$geometry这么命令是用来接收查询条件的GeoJSON对象
*包含
$within
db.open.street.map.find( {"loc":{"$within":{"$geometry":eastVillage}}} )
*接近
$near
db.open.street.map.find( {"loc":{"$near":{"$geometry":eastVillage}}} )
这是唯一一个结果进行排序的地理空间操作符,是根据距离从近到远排序的
可以将这个索引使用复合索引,复合索引的规则就是查询的时候将过滤掉尽可能多的字段放在前面
~2d
用于平面地图和时间连续的数据
建立索引的命令就不说了,后面索引改成"2d"就可以了
5、使用GirdFS存储文件
GirdFS是MongoDB的一种存储机制,用来存储大型二进制文件
优点:
*使用GirdFS可以简化你的栈
*GirdFS会自动平衡已有的复制或者为MongoDB设置自动分片,所以对文件存储做故障转移或者横向扩展会更容易
*当用于存储用的上传文件时,GirdFS可以轻易解决其他一些文件系统可能遇到的问题
*在GirdFS中文件存储的集中度会比较高。
GirdFs会有一些缺点:
*性能低,从MongoDB中读取文件不如直接从文件系统中读取文件速度快
*如果要在GirdFs上修改文档,只能删掉文档,然后将整个文档重新保存
~入门
mongofiles
三个操作:
put操作可以将文件系统中选定的文档上传到GirdFS上
list列出GirdFS中的文件
get用于下载文件,与put相反
search搜索
delete删除
~深入
GridFS是一种轻量级的文件存储规范。
理念:GridFS可以将大文档分割为比较大的块,将每个块进行独立存储。因为MongoDB支持存储二进制文档,所以更加降低了开销,GridFS还用一个文档将这些块文档组织在一起,并存储该文件的元信息。
块默认的集合是fs.chunks
fileds_id:块的元信息
no:块文件中的相对位置
data:块所包含的二进制数据
每个文件的元信息默认存储在集合fs.files
_id:文件唯一id,就是fileds_id
length:文件所包含的字节数
chunkSize:组成文件的每个块的大小,单位是字节,这个值默认是256kb,可以在需要时进行调整。
uploadData:文件被上传到GirdFS的日期
md5:文件内容的md5值,这个值由服务器计算得到
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值