2011-10-09 20 views

Odpowiedz

47

Można zdefiniować indeksy geo tak w mongoid

class Item 
    include Mongoid::Document 

    field :loc, :type => Array 

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

) 
end 

A dla kwerend

$ pobliżu polecenia (bez maxDistance)

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

$ najbliższej komendzie (z maxDistance)

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

Konwersja odległość od 111.12 (jeden stopień wynosi około 111.12 kilometrów) przy użyciu km, lub zostawić dystans, jak to jest na wykorzystaniu stopnia

$ centerSphere/$ nearSphere odpytuje

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

ten znajdzie przedmioty w promieniu 10 km. Tutaj musimy przekonwertować odległość/6371 (promień ziemi), aby uzyskać pracę z kilometrami.

$ box (ograniczające zapytań box)

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 obrębie danej obwiedni.

+0

gdy próbuję za pomocą $ niedaleko komendy (z maxDistance) zwraca błąd: wartości geo muszą być liczbami: {$ maxDistance: 0.001799856011519079, $ pobliżu [80,249, 13,060422]} Wszelkie myśli? Działa tylko z "$ near" w miejscu, ale kiedy dodaję "$ maxDistance", dławi się. – Vasily

+0

@Vasily, nie jestem pewien .. Zapytanie $ near z $ maxdistance działa idealnie dobrze z podanymi wartościami. 'Item.where (: loc => {" $ near "=> [80.249, 13.060422], '$ maxDistance' => 0.001799856011519079})'. działa dobrze. Może chcesz pokazać mi zapytanie, które próbujesz? zobaczymy wtedy – RameshVel

+0

Mam ten sam błąd, gdy używam maxDistance. Ruby 1.8. Czy znaleźliście rozwiązanie? –

7

Odpowiedź RameshVela jest świetna.

jako aktualizacja w Mongoid 3.0.4, miałem do określenia wskaźnika w następujący sposób, aby pracować z rake db:mongoid:create_indexes:

index(
    { loc: Mongo::GEO2D }, 
    { background: true } 
) 
+6

Właściwie to nie działało dla mnie z 'Mongoid 3.0.0', dokumentacja wskazuje następujący format' index ({loc: "2d"}, {min: -200, max: 200}) '. Twoje zdrowie. – rjgonzo

0

Wszystkie te odpowiedzi są nieaktualne z najnowszymi wersjami MongoDB i rzuci niektóre uninitialized constant Mongo::GEO2D

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

Powiązane problemy