首页 > 解决方案 > Geo Json Query - 通过检查给定的地理点是否位于记录的地理点的半径内来列出所有记录

问题描述

我正在构建一个应用程序,用户根据位置搜索服务提供商。

需要考虑以下几点

让我们考虑一下我有以下细节

服务商:S1:{lat:xxxx,long:xxxx,半径:5km} S2:{lat:xxxx,long:xxxx,半径:6km}

等等..

现在,当用户从特定的 lat,long 搜索时,我需要以用户的 lat,long 落在服务提供商半径内的方式列出所有服务提供商。

那就是我需要列出用户的地理位置和提供商的地理位置之间的距离小于提供商半径的所有服务提供商

如何使用 mongodb geoSpatial 查询来实现这一点?

标签: databasemongodbgeojsongeo

解决方案


为了使用 MongoDB 地理查询,您需要将坐标存储在旧坐标对中,

{loc:[long, lat], radius: 5}

或作为GeoJson 对象

{loc:{type:"point",[long, lat]}, radius: 5}

您还需要在字段上使用2dsphere 索引loc

搜索时,首先使用$geoNear,指定字段名称distanceField和地球的半径distanceMultiplier(使用与文档中的半径字段相同的单位)。然后用于$match仅返回比其相应半径更近的文档。

例如,如果集合包含以下文档:

{Name:"Prem Fast Food Corner",
 loc:{type:"Point",
      coordinates:[77.2069656,28.6143675]}, 
 radius:15},
{Name:"The Black Beetle",
 loc:{type:"Point", 
      coordinates:[77.0693677,28.5842962]}, 
 radius:10}

并且有一个 2dsphere 索引loc,我们可以使用聚合查询,发现 Cariappa Parade Ground 仅在其中一家餐厅的送货半径内。

db.geo.aggregate([
    {$geoNear:{
               near:[77.1385933,28.6653018],
               distanceField:"distance",
               distanceMultiplier:6378,
               spherical:true
    }},
    {$match:{
         $expr:{
             $lte:[ "$distance", "$radius" ]
         }
    }}
])

推荐阅读