我有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
大多数示例都基于搜索圆内的点(半径是查询的一部分,所有文档都相同)没有找到与点相交的圆(圆的半径不同)。
答案 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()
。
这就是你在服务器处理中的表现。