特殊索引和集合
1. 固定集合:固定集合需要事先创建好看,而且它的大小是固定的。当固定集合被占满时,如果再插入新文档,固定集合会自动将最老的文档从集合中删除。
2. 创建固定集合:db.createCollection("my_collection",{"capped":true,"size":10000}) 创建一个大小为10000字节的固定集合
除了大小,createCollection还能指定固定集合中文档的数量:db.createCollection("my_collection",{"capped":true,"size":10000,"max":10})
指定文档数量时,必须同时指定集合大小。固定集合的文档数量不能超过文档数量限制,固定集合的大小也不能超过大小限制。
3. 将某个常规集合转换为固定集合:db.runCommand({"convertToCapped":"test","size":10000}) 无法将固定集合转换为非固定集合。
4. 自然排序:自然排序返回结果集中文档的顺序就是文档在磁盘上的顺序。只有固定集合中的自然排序才有意义,对其他集合来说文档位置经常变化,自然排序意义不大。
5. 循环游标:一种特殊的游标,当循环游标的结果集被取光后,游标不会被关闭。当有新文档插入到集合时,循环游标会继续取到结果。由于普通集合并不维护文档的插入顺序,循环游标只能用在固定集合上。
6. 调用createCollection创建集合时指定autoIndexId选项为false,创建集合时就不会自动在"_id"上创建索引。实践中不建议这么用,但对于只有插入操作的集合来说,这确实可以带来速度上的稍许提升。
7. TTL索引:如果需要更加灵活的老化移出系统,可以使用TTL索引,这种索引允许为每一个文档设置一个超时时间。一个文档到达预设置的老化程度之后就会被删除。这种类型的索引对于缓存问题很有用。
db.foo.ensureIndex({"lastUPdated":1},{"expireAfterSecs":60*60*24}) // 过期时间24小时
MongoDB每分钟对TTL索引进行一次清理,所以不应该依赖以秒为单位的时间保证索引的存活状态。可以使用collMod命令修改expireAfterSecs的值:
db.runCommand({"collMod":"someapp.cache","expireAfterSecs":3600})
一个给定的集合上可以有多个TTL索引,但TTL不能是复合索引。
8. 全文本索引:暂不建议使用,性能影响太大。
9. 地理空间索引:最常用的是2dsphere索引(用于地球表面类型的地图)和2d索引(用于平面地图和时间连续的数据)
10. 使用GridFS存储文件:GridFS是MongoDB的一种存储机制,用来存储大型二进制文件。
优点:
a. 简化你的栈,可以使用GRIDFS来代替独立的文件存储工具。
b. 对文件存储做故障转义或者横向扩展更容易
c. 可以比较从容地解决其他一些文件系统可能遇到的问题。
d. 文件存储的集中度会比较高
缺点:
a. 性能低:从MongoDB中访问文件,不如直接从文件系统中访问文件速度快。
b. 如果要修改GridFS上的文档,只能先将已有的文档删除。
通常来说,如果你有一些不常改变但是经常需要连续访问的大文件,那么使用GridFS再合适不过。(性能呢?因为缓存到内存了?)
11. GridFS背后的理念:可以将大文件分割为多个比较大的块,将每个快作为独立的文档进行存储。有一个文档用于将这些块组织在一起并存储该文档的元信息。
12. 可以使用任何自定义的字段来保存必须的文件元信息。可能你希望在文件元信息中保存文件的下载次数,MIME类型或者用户评分。