随着智能移动设备的增长,对基于位置服务的需求正稳步提升。要构建这些与位置相关的应用程序,数据库需要能索引并查询空间数据。这些特性很早就加入了MongoDB的线路图,虽说MongoDB的空间索引(spatial indexing)还没有达到PostGIS这种完整的功能,但已经可以支撑许多流行站点的位置查询了。1
1. 其中最著名的就是Foursquare(http://foursquare.com)。从http://mng.bz/rh4n可以了解到更多Foursquare使用MongoDB的情况。
正如其名所示,空间索引针对表示位置的数据进行了优化。在MongoDB中,这类数据通常表示为地理坐标系中的经度和纬度,其上的空间索引允许基于用户的位置进行查询。例如,你有一个集合,其中包含了纽约城(New York City)中每家餐厅的菜单数据和坐标,有了餐厅位置的索引,你就可以查询数据库,找到离布鲁克林大桥(Brooklyn Bridge)最近的提供鱼子酱的餐厅。
而且,空间索引器足够通用,足以适用于地球坐标以外的场景。也就是说,你甚至可以用它来索引二维坐标平面或者是火星上的位置。2无论什么样的场景,空间索引都相对容易构建与查询。此处我会描述如何构建空间索引、可执行的查询的范围,以及一些内部设计细节。
2. 前者有一个很好的例子——WordSquared(http://wordsquared.com),这是一个类似Scrabble的游戏,使用了MongoDB的空间索引对棋盘上的格子进行查询。