地理空间索引示例#

此示例演示如何创建和使用 GEO2D PyMongo索引。要创建球形(类似地球)地理空间索引,请使用 GEOSPHERE 相反。

参见

上的MongoDB文档 Geospatial Indexes

创建地理空间索引#

在pymongo中创建地理空间索引非常简单:

>>> from pymongo import MongoClient, GEO2D
>>> db = MongoClient().geo_example
>>> db.places.create_index([("loc", GEO2D)])
'loc_2d'

插入位置#

MongoDB中的位置使用嵌入文档或列表表示,其中前两个元素是坐标。这里,我们将插入几个示例位置:

>>> result = db.places.insert_many(
...     [{"loc": [2, 5]}, {"loc": [30, 5]}, {"loc": [1, 2]}, {"loc": [4, 4]}]
... )
>>> result.inserted_ids
[ObjectId('...'), ObjectId('...'), ObjectId('...'), ObjectId('...')]

备注

如果在中指定纬度和经度坐标 GEOSPHERE ,列出 经度 首先,然后 纬度 .

查询#

使用地理空间索引,我们可以在另一个点附近找到文档:

>>> import pprint
>>> for doc in db.places.find({"loc": {"$near": [3, 6]}}).limit(3):
...     pprint.pprint(doc)
...
{'_id': ObjectId('...'), 'loc': [2, 5]}
{'_id': ObjectId('...'), 'loc': [4, 4]}
{'_id': ObjectId('...'), 'loc': [1, 2]}

备注

如果使用 pymongo.GEOSPHERE ,建议使用$nearSphere。

$maxDistance运算符需要使用 SON

>>> from bson.son import SON
>>> query = {"loc": SON([("$near", [3, 6]), ("$maxDistance", 100)])}
>>> for doc in db.places.find(query).limit(3):
...     pprint.pprint(doc)
...
{'_id': ObjectId('...'), 'loc': [2, 5]}
{'_id': ObjectId('...'), 'loc': [4, 4]}
{'_id': ObjectId('...'), 'loc': [1, 2]}

还可以查询给定矩形内的所有项目(由左下角和右上角坐标指定):

>>> query = {"loc": {"$within": {"$box": [[2, 2], [5, 6]]}}}
>>> for doc in db.places.find(query).sort("_id"):
...     pprint.pprint(doc)
...
{'_id': ObjectId('...'), 'loc': [2, 5]}
{'_id': ObjectId('...'), 'loc': [4, 4]}

或圆(由圆心和半径指定):

>>> query = {"loc": {"$within": {"$center": [[0, 0], 6]}}}
>>> for doc in db.places.find(query).sort("_id"):
...     pprint.pprint(doc)
...
{'_id': ObjectId('...'), 'loc': [2, 5]}
{'_id': ObjectId('...'), 'loc': [1, 2]}
{'_id': ObjectId('...'), 'loc': [4, 4]}

geonore查询也支持使用 SON ::

>>> from bson.son import SON
>>> db.command(SON([('geoNear', 'places'), ('near', [1, 2])]))
{'ok': 1.0, 'stats': ...}

警告

从MongoDB 4.0版开始,MongoDB不推荐使用 近地轨道 命令。请改用下列操作之一。

  • $geonline-聚合阶段。

  • $near-查询运算符。

  • $nearSphere-查询运算符。