MongoDB z Mongoid w Rails - indeksowanie geoprzestrzenne
MongoDB ma bardzo ładną funkcję indeksowania geoprzestrzennego . Jak Mogę używać go w Rails z Mongoid?
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.
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 }
)
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.
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