找到包含点的Mongoid geospacial圆圈

时间:2015-06-15 16:31:38

标签: mongodb mongoid geospatial

我有Mongoid文件,代表当地商家提供的服务。每个都有一个或多个位置(lat / lng点)和服务区域(半径)。给定客户位置(lat / lng点),如何找到客户所在位置在服务区内的所有文档?

class Service
  include Mongoid::Document

  # Data currently stored like this:
  field :address, type: String
  field :service_distance, type: Float

  # Happy to geocdoe and store in another format
end    

大多数示例都基于搜索圆内的点(半径是查询的一部分,所有文档都相同)没有找到与点相交的圆(圆的半径不同)。

1 个答案:

答案 0 :(得分:1)

建模"圈"通过指定"中心"是一种有效的方法。和#34;半径",但在圆圈内找到东西""如果不是立即显而易见,通常是直截了当的:

Service.collection.aggregate([

    # Get the distance from the current location
    { "$geoNear" => {
        "near" => {
           "type" => "Point",
           "coordinates" => [ 1, 1 ] 
        },
        "distanceField" => "dist"
    }},

    # Find out if the "dist" is within the radius
    { "$project" => {
        "address" => 1,
        "service_distance" =>1,
        "location" => 1,  # the field with the co-ordinates you add
        "dist" => 1,
        "within" => { "$lt" => [ "$dist", "$service_distance" ] }
    }},

    # Then filter out anything not "within"
    { "$match" => { "within" => true } }

])

因此$geoNear aggregation运算符不仅可以找到文档" near"指定的点,但也"项目"表示"距离"的文档中的字段。从查询中的那一点开始。

注意"额外字段"你在这里要求("位置")是实际的"坐标" " Point"对于" shop"的圆心。位于。这是此处所需的额外字段。

接下来要做的是"比较"到"半径"的计算距离;或者" service_distance"包含在文件中,看是否是"小于"或者"在"内那个距离。

然后,如果结果为true,您会保留这些文件并将其显示在最终答案中。

这里的.collection访问器允许您使用本地MongoDB方法,例如允许这些操作的.aggregate()

这就是你在服务器处理中的表现。