Python + MongoDB:批量/批量查找查询

时间:2017-08-19 13:23:39

标签: python mongodb pymongo

我有一个MongoDB(PyMongo)地理位置集合,由经度和纬度指定。基于此我运行距离查询。一切都很好。

情景和问题:我有多个GPS坐标。对于每个坐标,我运行一个查找操作,用于集合,因此具有一系列查找查询。

问题但我想知道是否有办法将所有这些查询查询(针对所有GPS坐标)合并到一个发送到MongoDB的批量/批量查找操作中,该操作一次检索所有结果?我知道有一个MongoDB BulkOperation,但这用于写操作,而找到并更新或删除项目。

到目前为止我得到了什么:这是我的代码。 MongoDB项的结构如下:

{'city': 'Berlin',
 'location': {'coordinates': [13.41053, 52.52437], 'type': 'Point'}}

基于这些项目,我创建了一个球形索引,支持基于经度和纬度的距​​离查询:

db_collection.create_index([("location", pymongo.GEOSPHERE)])

现在,我可以执行单个查找查询,这些查询可以为我提供围绕兴趣点的最大距离的其他城市。例如,这个查询给了我所有城市(我的收藏)在柏林周围30公里的距离。

{'location': {'$nearSphere': {'$geometry': {'coordinates': [13.41053,
     52.524369999999998],
    'type': 'Point'},
   '$maxDistance': 30000}}}

该查询用于以下代码:

max_distance = 30 #km
lng, lat = row['lng'], row['lat'] # Berlin
query = {"location": {"$nearSphere": { "$geometry": { "type": "Point", "coordinates": [lng, lat] }, "$maxDistance": max_distance * 1000} } }

#query = {"location": {"$nearSphere": {"$geometry": {"type": SON([("$coordinates", [row['lng'], row['lat']]), ("$maxDistance", 20000)])}}}}
#query = {"location": SON([("$nearSphere", [row['lng'], row['lat']]), ("$maxDistance", 500)])}
for doc in db_collection.find(query).limit(100):
    coords = doc['location']['coordinates']
    print (doc['city'], coords, haversine_distance_km(lng, lat, coords[0], coords[1]))

产生正确的结果。 备注:结果仅包含其他城市,但查询位置与城市之间的距离必须使用Harversine公式计算。

Berlin [13.41053, 52.52437] 0.0
Potsdam [13.06566, 52.39886] 27.215703627815788

PS:原始位置列表(用于测试目的)是:

import pandas as pd
import numpy as np

df = pd.DataFrame([{'city':"Berlin", 'lat':52.5243700, 'lng':13.4105300},
                   {'city':"Potsdam", 'lat':52.3988600, 'lng':13.0656600},
                   {'city':"Hamburg", 'lat':53.5753200, 'lng':10.0153400}]);
df

0 个答案:

没有答案