地理空间索引
地理空间索引是MongoDB专门为当前热门的GIS应用提供的特殊索引支持。这种索引和普通的索引创建、删除方式相同,不同的是这种索引的在创建时候的值:
创建方法
db.collection.ensureIndex({keyName:"2d"},{'min':-1000,max:1000})
注意,这里使用的是"2d"而不是表示排序的1或-1。同时对key的值当然也有比较严格要求:
建立地理空间索引的key的value值必须是某种形式的一对值:一个包含两个元素的数组或包含两个键的文档。默认情况下该索引值的范围是-180到180(经纬度),也可以通过min、max来确定。
查询方法
对于地理空间索引的查询分为两种情况:
普通查询
普通查询和我们上边讲到的find差别不大,但是引入了另一些专门用于GIS查询的新条件句和命令,以下的条件句必须是建立在创建2dIndex之后才能够使用,否则MongoDB会提示13038错误:
$near
db.collection.find({keyName:{'$near':[value1,value2]}})
会按value1,value2为中心由近及远的将集合中的所有文档都返回,没有指定limit的时候默认是100个文档,可以通过limit减少查询内容。
geoNear
db.runCommand({geoNear:collectionName,near:[value1,value2],num:显示数字(limit作用)})
这个使用runCommand形式的查询和$near条件句类似,但是geoNear可以返回每个文档距离目标value1,value2的距离,以'dis'来表示,但是当查询的数据大于4M,就只能至少用$near条件句方式。
$within
矩形:db.collection.find({keyName,{'$within':{'$box':[[左下角坐标],[右上角坐标]]}}})
圆形:db.collection.find({keyName,{'$within':{'$center':[[圆心坐标],半径]}}})
不只是根据点找附近点的功能,MongoDB还提供了形状(矩形、圆形和多边形)范围内查找的功能。
查询提示
在实际使用的时候不只是范围,同时还有范围内的某个资源,所以,一般在每个资源文档上都创建一个关键字key来描述该文档数据哪种资源。这样就可以快速的超找到某个范围内的某些资源。