Search code examples
ruby-on-railsrubymongodbgeolocationmongoid

MongoDB with Mongoid in Rails - Geospatial Indexing


MongoDB has a very nice Geospatial Indexing feature. How can I use it in Rails with Mongoid?


Solution

  • You can define geo indexes like this in mongoid

    class Item
      include Mongoid::Document
    
      field :loc, :type => Array
    
      index(
          [
              [:loc, Mongo::GEO2D]             
          ], background: true
    
      )
    end
    

    And for queries

    $near command (without maxDistance)

     location = [80.24958300000003, 13.060422]
     items = Item.where(:loc => {"$near" => location})
    

    $near command (with maxDistance)

     distance = 10 #km
     location = [80.24958300000003, 13.060422]
     items = Item.where(:loc => {"$near" => location , '$maxDistance' => distance.fdiv(111.12)})
    

    Convert distance by 111.12 (one degree is approximately 111.12 kilometers) when using km, or leave distance as it is on using degree

    $centerSphere / $nearSphere queries

    location = [80.24958300000003, 13.060422]
    items = Item.where(:loc => {"$within" => {"$centerSphere" => [location, (distance.fdiv(6371) )]}})
    

    This will find the items within the 10 km radius. Here we need to convert the distance/6371(earth radius) to get it work with km.

    $box (bounding box queries)

     first_loc = [80.24958300000003, 13.060422]
     second_loc = [81.24958300000003, 12.060422]
     items = Item.where(:loc => {"$within" => {"$box" => [first_loc, second_loc]}})
    

    This will help you to find the items within the given bounding box.