このようなジオインデックスをモンゴイドで定義できます
class Item
include Mongoid::Document
field :loc, :type => Array
index(
[
[:loc, Mongo::GEO2D]
], background: true
)
end
そしてクエリの場合
$ near コマンド(maxDistanceなし)
location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$near" => location})
$ near コマンド(maxDistanceを使用)
distance = 10 #km
location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$near" => location , '$maxDistance' => distance.fdiv(111.12)})
kmを使用する場合は、距離を111.12(1度は約111.12 km)で変換するか、度を使用する場合は距離をそのままにします
$ centerSphere / $ nearSphere クエリ
location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$within" => {"$centerSphere" => [location, (distance.fdiv(6371) )]}})
これにより、半径10km以内のアイテムが見つかります。ここでは、距離/ 6371(地球半径)をkmで機能させるために変換する必要があります。
$ box (バウンディングボックスクエリ)
first_loc = [80.24958300000003, 13.060422]
second_loc = [81.24958300000003, 12.060422]
items = Item.where(:loc => {"$within" => {"$box" => [first_loc, second_loc]}})
これは、指定されたバウンディングボックス内のアイテムを見つけるのに役立ちます。