MongoDB z Mongoid w Rails - indeksowanie geoprzestrzenne

MongoDB ma bardzo ładną funkcję indeksowania geoprzestrzennego . Jak Mogę używać go w Rails z Mongoid?

Author: CamelCamelCamel, 2011-10-09

3 answers

Możesz zdefiniować indeksy geograficzne w mongoid

class Item
  include Mongoid::Document

  field :loc, :type => Array

  index(
      [
          [:loc, Mongo::GEO2D]             
      ], background: true

  )
end

Oraz dla zapytań

$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)})

Przelicz odległość przez 111,12 (jeden stopień to około 111,12 km) przy użyciu km, lub pozostaw odległość tak, jak jest na użyciu stopnia

$centerSphere / $nearSphere queries

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

To znajdzie przedmioty w promieniu 10 km. Here we trzeba przeliczyć odległość / 6371 (promień Ziemi), aby to działało z 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]}})

To pomoże Ci znaleźć elementy w danej obwiedni.

 49
Author: RameshVel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-09 09:05:42

Odpowiedź Rameshvela jest świetna.

Jako aktualizacja, w Mongoid 3.0.4 musiałem zdefiniować indeks w następujący sposób, aby działał z rake db:mongoid:create_indexes:

index(
  { loc: Mongo::GEO2D },
  { background: true }
)
 7
Author: Jake Vose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-28 15:36:53

Wszystkie te odpowiedzi są przestarzałe z najnowszymi wersjami MongoDB i rzuci trochę uninitialized constant Mongo::GEO2D

Dla mongoid 4/5, proponuję spojrzeć na mongoid-Geospatial gem jeśli chcesz grać z obiektami 2D lub współrzędnych.

 1
Author: Cyril Duchon-Doris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-09 17:34:34