前言
关于 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 索引的创建、结构以及查询使用方法,包括语法格式和代码示例。这两种索引在实际开发中非常有用,特别是针对位置定位方面的应用场景。读者可以通过本文的学习和实践,掌握这两种索引的使用,并应用到实际开发中。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67973060504e4ea9bde3b5fb