Mongodb 学习笔记5:索引

索引是用来加速查询的。

创建索引:

>db.person.ensureIndex({"name":1})  ------1表示升序,-1表示降序

一般一定要创建查询中用到的所有键的索引,索引才会在查询启作用。

>db.person.find({"date":date1}).sort({"date":1,"name":1})       

上述查询必须进行表扫描,需要进行以下操作:

>db.person.ensureIndex({“date”:1,"name":1}) 

组合索引键的排列不同,建立的索引不同。

默认下索引名为:keyname1_dir1_keyname2_dir2_keyname3_dir3……这种形式,dir代表索引的方向1或者-1.可以给索引命名:

>db.person.ensureIndex({“date”:1,"name":1},{"name":"date_name")

explain()返回查询使用的索引情况,耗时及扫描文档数的统计信息。 

索引建立是要花费很多时间的,可以使用{"background”:true}选项是创建过程在后台运行。

下图显示了索引创建前后的性能对比:

   cursor:       mongodb采用B树的结构来存放索引,索引名为后面的“name_1"。

   nscanned:  代表查找了多少个文档。

   n:             返回文档的数量

   millis:       执行所需的时间

创建唯一索引

>db.person.ensureIndex({“date”:1,"name":1},{"unique":"true"})

insert不检查文档是否插入过了。

当为已有集合创建索引,有些文档值已经重复了,则使用dropDups选项,保留第一个文档。

>db.person.ensureIndex({“date”:1,"name":1},{"unique":"true","dropDups":true})

唯一复合索引:单个键值可以相同,但所有键值组合不同。

删除索引:dropIndexes

 


地理空间索引:找到离当前位置最近的N个场所,为坐标平面查询建立索引

gps"键的值是一个包含两个元素的数组或者两个键的内嵌文档,键名可以任意。默认情况下值的范围:-180~180。可以指定最大最小值。

>db.map.ensureIndex({"gps":"2d"})      

>db.map.ensureIndex({"gps":"2d"},{"min":-1000,"max":1000}   

"{"gps":[0,100]}

{"gps":{”x":-30,"y":30})

{"gps":{"latitude":-180,"longitude":180}}

地理空间查询

find():"$near":两个目标值数组作为参数。

>db.map.find({"gps":{"$near":[40,-73]}})

按照离点(40,-73)由近及远的方式将map集合的所有文档都返回。默认返回100个文档。

 

>db.map.find({"gps":{"$near":[40,-73]}}).limit(10)

以下操作同样完成上述功能,还返回每个文档到查询点的距离。

>db.runCommand({geoNear:"map",near:[40,-73],num:10});

还可以找指定形状内的文档:

 

 

>db.map.find({"gps":{"$within":{”$box":[[10,20],[15,30]]}}})

"$box":第一个参数指定左下角的坐标,第二个参数指定右上角的坐标

"$center":指定圆心和半径:

>db.map.find({"gps":{"$within":{”$center":[[12,25],5]}}})

符合地理空间索引

>db.map.ensureIndex({"gps":"2d","desc":1})    

查找最近的咖啡馆:

 

>db.map.find({"gps":{"$near":[40,-73]},"desc":"coffeeshop"}).limit(1)

 

 

 

 

转载于:https://www.cnblogs.com/lucyawei/archive/2013/04/28/3048967.html