索引是用来加速查询的。
创建索引:
>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)