前言
关于 MongoDB 的索引,我们往往只了解到常见的单键索引和复合索引。但是在实际开发中,我们可能需要用到空间定位方面的查询,这时就要用到两种不同的索引:2D 和 2D Sphere 索引。
本文将详细介绍 MongoDB 的 2D 和 2D Sphere 索引的创建、结构以及查询使用方法,并提供代码示例,帮助读者深入学习和理解。
2D 索引
创建 2D 索引
创建 2D 索引的语法格式如下:
db.collection.createIndex({ location: "2d" })
其中,location
是要进行定位的字段名,这里假设数据集合为 collection
。创建索引后,MongoDB 将会根据 location
字段建立一张新的索引数据集合 collection.$_location
。 _location
中存储了每个文档的 location
值以及它们对应的 _id
。对 _location
建立的索引默认使用 B 树算法。
在 2D 索引中插入数据
在进行 2D 索引的插入操作时,需要按以下方式指定字段值:
db.collection.insert({ location: { type: "Point", coordinates: [ longitude, latitude ] } })
其中,coordinates
按经度、纬度的顺序进行存储。MongoDB 采用的是 Geo-JSON 格式,而 type
属性指定的对象类型是 Point
。当然,也可以用 LineString
或 Polygon
等其他类型。如果是区域表示方法,可以使用以下方式:
db.collection.insert({ location: { type: "Polygon", coordinates: [ [ [lng1, lat1], [lng2, lat2], [lng3, lat3], [lng4, lat4], [lng1, lat1] ] ] } })
2D 索引查询
查询点附近的文档
查询方法如下:
db.collection.find({ location: { $near: { $geometry: { type: "Point", coordinates: [ longitude, latitude ] }, $maxDistance: 2000 } } })
其中,$near
表示查询在指定点附近的文档,$maxDistance
表示查询距离不超过 2000 米的文档。
查询矩形区域内的文档
查询方法如下:
-- -------------------- ---- ------- -------------------- --------- - ----------- - ----- - - --------------- -------------- -- - ------------- ------------ - - - - --
其中,$geoWithin
表示查询在指定区域内的文档,$box
表示指定矩形的左下角和右上角坐标。
示例代码
-- -------------------- ---- ------- -- -- -- -- ----------------------- ----------- ---- -- -- - -- ------- ------------------ ----- -------- ------ --------- - ----- -------- ------------ - ------- ----- - - -- -- -------- ---------------- --------- - ------ - ---------- - ----- -------- ------------ - ------- ----- - -- ------------- ---- - - -- -- ---------- ---------------- --------- - ----------- - ----- - - ------ ---- -- - ------ ---- - - - - --
2D Sphere 索引
2D Sphere 索引与 2D 索引本质上不同,适用于地理坐标系中的大圆操作。在经纬度表示下,用球面计算距离与使用平面直线计算距离有所不同,使用 2D Sphere 索引经常比使用 2D 索引更优。
创建 2D Sphere 索引
创建 2D Sphere 索引的语法格式如下:
db.collection.createIndex({ location: "2dsphere" })
其中,location
的数据类型应该是 GeoJSON 类型。索引创建后将会创建索引数据集合 collection.$_location
。
在 2D Sphere 索引中插入数据
在进行 2D Sphere 索引的插入操作时,可以按以下方式指定字段值:
db.places.insert({ name: "New York", location: { type: "Point", coordinates: [ -74.0059, 40.7128 ] } })
2D Sphere 索引查询
在 2D Sphere 索引中进行排序和查询文档
查询方法如下:
db.places.find({ location: { $nearSphere: { $geometry: { type: "Point", coordinates: [ longitude, latitude ] } } } })
其中,$nearSphere
表示查询在指定点附近的文档。
计算两个地理位置之间的距离
查询方法如下:
db.places.find({ location: { $nearSphere: { $geometry: { type: "Point", coordinates: [ longitude, latitude ] }, $maxDistance: 2000 } } })
其中,$maxDistance
表示查询距离不超过 2000 米的文档。
示例代码
-- -------------------- ---- ------- -- -- -- ------ -- ----------------------- ----------- ---------- -- -- - -- ------ ------- ------------------ ----- ---------- --------- - ----- -------- ------------ - -------- ------ - - -- -- - -- ------ ------------ ---------------- --------- - ------------ - ---------- - ----- -------- ------------ - ------ ---- - - - - -- -- ------------- ---------------- --------- - ------------ - ---------- - ----- -------- ------------ - ------ ---- - -- ------------- ----- - - --
结语
本文详细介绍了 MongoDB 的 2D 和 2D Sphere 索引的创建、结构以及查询使用方法,包括语法格式和代码示例。这两种索引在实际开发中非常有用,特别是针对位置定位方面的应用场景。读者可以通过本文的学习和实践,掌握这两种索引的使用,并应用到实际开发中。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67973060504e4ea9bde3b5fb