Mongodb 特殊索引和集合

固定集合(适用于记录日志)

固定集合需要事先创建好,而且它的大小是固定的.当固定集合被占满时,如果再插入新文档,固定集合会自动将最老的文档从集合中删除。

固定集合的文档数量不能超过文档数量限制,固定集合的大小也不能超过大小限制。已首先到达限制为准。

创建固定集合

db.createCollection(" my_collection", {" capped" : true, "size" : 100000,‘max‘:100});

capped :固定集合

my_collection :集合名词

size : 集合大小

max :文档数量

将普通集合转换为固定集合

db.runCommand({" convertToCapped" : "test", "size" : 10000});

不能将固定集合转换成普通集合

自然排序

对固定集合可以进行一种特殊的排序,称为自然排序(naturalsort)。自然排序返回结果集中文档的顺序就是文档在磁盘上的顺序。

自然排序得到的文档是从旧到新排列的。当然也可以按照从新到旧的顺序排列

db.my_collection.find(). sort({" $ natural" : -1})

循环游标

循环游标(tailablecursor)是一种特殊的游标,当循环游标的结果集被取光后,游标不会被关闭。循环游标的灵感来自tail-f命令(循环游标跟这个命令有点儿相似),会尽可能久地持续提取输出结果。由于循环游标在结果集取光之后不会被关闭,因此,当有新文档插入到集合中时,循环游标会继续取到结果。由于普通集合并不维护文档的插入顺序,所以循环游标只能用在固定集合上。

TTL索引-具有生命周期的索引

创建TTL索引

db.foo.ensureIndex({" lastUpdated" : 1}, {" expireAfterSecs" : 60* 60* 24})

这样就在"lastUpdated"字段上建立了一个TTL索引。如果一个文档的"lastUpdated"字段存在并且它的值是日期类型,当服务器时间比文档的"lastUpdated"字段的时间晚expireAfterSecs秒时,文档就会被删除。

MongoDB每分钟对TTL索引进行一次清理,所以不应该依赖以秒为单位的时间保证索引的存活状态。可以使用collMod命令修改expireAfterSecs的值:

db.runCommand({" collMod" : "someapp.cache", "expireAfterSecs" : 3600})

TTL索引不能是复合索引,但是可以像“普通”索引一样用来优化排序和查询。

地理空间索引

2dsphere

允许使用GeoJSON格式指定点、线和多边形。

点可以用形如[longitude,latitude]([经度,纬度])的两个元素的数组表示:

{ "name" : "New York City", "loc" : { "type" : "Point", "coordinates" : [50, 2] } }

线可以用一个由点组成的数组来表示:

{ "name" : "Hudson River", "loc" : { "type" : "Line", "coordinates" : [[ 0,1], [0,2], [1,2]] } }

多边形的表示方式与线一样(都是一个由点组成的数组),但是"type"不同:

{ "name" : "New England", "loc" : { "type" : "Polygon", "coordinates" : [[ 0,1], [0,2], [1,2]] } }

创建索引

db.world.ensureIndex({" loc" : "2dsphere"})

交集查询 $geoIntersects

var eastVillage = { ... "type" : "Polygon", ... "coordinates" : [ ... [-73.9917900, 40.7264100], ... [-73.9917900, 40.7321400], ... [-73.9829300, 40.7321400], ... [-73.9829300, 40.7264100] ... ]}

db.map.find({"loc" : {" $geoIntersects" : {"$geometry" : eastVillage}}})

包含查询 $within

db.map.find({"loc" : {"$within" : {"$geometry" : eastVillage}}})

附近查询 $near

db.map.find({"loc" : {" $near" : {" $geometry" : eastVillage}}})

2D索引

对于非球面地图(游戏地图、时间连续的数据等)。只能对点进行索引。

数据类型[22,22]坐标

创建索引

db.world.ensureIndex({" tile" : "2d"})

包含查询 $near

db.world.find({" tile" : {" $ near" : [20, 21]}})

附近查询 $within $box表示矩形

db.hyrule.find({" tile" : {" $ within" : {" $ box" : [[ 10, 20], [15, 30]]}}})

时间: 2024-10-16 22:28:14

Mongodb 特殊索引和集合的相关文章

MongoDB数据库索引

前面的话 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录.这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的.本文将详细介绍MongoDB数据库索引 引入 索引能够提高查询效率,如何体现呢?接下来使用性能分析函数explain()来进行分析说明 首先,插入10万条数据 接着,不创建索引,来寻找time范围在100和200之间的文档 由图中所知,tot

Mongodb的索引

1. 简单介绍 索引是为了加速查询. 假设没有索引,mongodb在查询时会做表扫描,假设集合非常大时,这个查询会非常慢. 一般对创建查询时的键都建立索引. 为排序字段建立索引,假设对未建立索引的字段sort,mongodb会将全部的数据取到内存中来排序, 假设集合大到不能在内存中排序,则mongodb会报错. 2. mongodb创建索引 创建索引使用ensureIndex命令. > db.people.ensureIndex({"username" : 1}); 上面语句对p

【MongoDB学习笔记20】MongoDB的索引

MongoDB的索引和关系型数据库的索引概念和功能是相同的: (1)不使用索引的搜索可以称为全表扫面,也就是说,服务器必须找完整个表才能查询整个结果: (2)建立索引后搜索,查询在索引中搜索,在索引的条目中找到条目以后,就可以直接跳转到目标文档的位置:这样的搜索比全表的搜索的速度要提高好几个数量级: 先向集合blog中添加1000000个文档: > for (i=0;i<1000000;i++){    ... db.users.insert(     ... {"i":i

MongoDB中索引的创建和使用详解

索引通常能够极大的提高查询的效率.在系统中使用查询时,应该考虑建立相关的索引.在MongoDB中创建索引相对比较容易. mongodb中的索引在概念上和大多数关系型数据库如MySQL是一样的.当你在某种情况下需要在MySQL中建立索引,这样的情景同样适合于MongoDB. 基本操作 索引是一种数据结构,他搜集一个集合中文档特定字段的值.MongoDB的查询优化器能够使用这种数据结构来快速的对集合(collection)中的文档(collection)进行寻找和排序.准确来说,这些索引是通过B-T

mongodb之索引学习

学习索引分类和创建索引:                1._id索引 大多数集合默认的索引2.单键索引:手动创建,一个单一的值3.多建索引:组合函数4.复合索引 :最左前缀原则5.过期索引 :一定时间内失效,注意点:必须是isodate或者其数组,不要使用时间戳,否则不会被自动删除.6.全文索引 db.tm.ensureindex({"article":"text"}),db.tm.ensureindex({"key1":"text&

mongodb设置索引和id

ensureIndex() 方法 要创建一个索引,需要使用MongoDB 的ensureIndex()方法. 语法: ensureIndex() 方法的基本语法如下 yiibai.com >db.COLLECTION_NAME.ensureIndex({KEY:1}) 这里关键是要在其中创建索引,1是按升序排列的字段名称.要创建降序索引,需要使用-1. 例子 >db.mycol.ensureIndex({"title":1}) > 在ensureIndex()方法,可

MongoDB入门学习(四):MongoDB的索引

上一篇讲到了MongoDB的基本操作增删查改,对于查询来说,必须按照我们的查询要求去集合中,并将查找到的结果返回,在这个过程中其实是对整个集合中每个文档进行了扫描,如果满足我们的要求就添加到结果集中最后返回.对于小集合来说,这个过程没什么,但是集合中数据很大的时候,进行表扫描是一个非常恐怖的事情,于是有了索引一说,索引是用来加速查询的,相当于书籍的目录,有了目录可以很精准的定位要查找内容的位置,从而减少无谓的查找. 1.索引的类型 创建索引可以是在单个字段上,也可以是在多个字段上,这个根据自己的

MongoDB索引(一) --- 入门篇:学习使用MongoDB数据库索引

这个系列文章会分为两篇来写: 第一篇:入门篇,学习使用MongoDB数据库索引 第二篇:进阶篇,研究数据库索引原理--B/B+树的基本原理 1. 准备工作 在学习使用MongoDB数据库索引之前,有一些准备工作要做,之后的探索都是基于这些准备工作. 首先需要建立一个数据库和一些集合,这里我就选用一个国内手机号归属地的库,大约32W条记录,数据量不大,不过做一些基本的分析是够了. 首先我们建立一个数据库,叫做db_phone,然后导入测试数据.测试数据就是一些手机号归属地的信息.单个文档长这个样子

MongoDB之索引

索引是用来加快查询的,这里不讲解索引的原理和数据结构,其实大部分数据库的索引就是B+Tree,想要了解的同学可以看索引原理,要掌握如何为查询配置最佳索引会有些难度. MongoDB索引几乎和关系型数据库的索引一样.绝大数优化关系型数据库索引的技巧同样适用于MongoDB. 我们举一个例子,现在集合中插入多个文档: db.lf.insert({"name":"lf","age":23,"isactive":true}) db.l