MongoDB ma bardzo fajną funkcję Geospatial Indexing. Jak mogę go używać w Railsach z Mongoidem?MongoDB z Mongoidem w szynach - Indeksowanie geoprzestrzenne
Odpowiedz
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.
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 }
)
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
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.
- 1. Zapytanie geoprzestrzenne MongoDB z $ not
- 2. "Nie równy" nazwany zakres w szynach z Mongoidem
- 3. MongoDB: Łącz wyszukiwanie tekstu i zapytania geoprzestrzenne
- 4. Jak mogę zobaczyć surowe zapytania mongoDB z Mongoidem
- 5. Błąd MongoDB z Mongoidem, Heroku, urządzeniem, MongoHQ i Railsami
- 6. Dane sprężyny - indeksowanie MongoDB DBRef
- 7. Jak zdobyć ostatnie N dokumentów z mongoidem?
- 8. Zapytania geoprzestrzenne w javascript
- 9. usuwanie dokumentów wbudowanych z mongoidem
- 10. Odnajdywanie wszystkich dokumentów w kolekcji z Mongoidem
- 11. Mongoose indeksowanie w kodzie produkcji
- 12. Logical indeksowanie z listami
- 13. częściowe indeksowanie mysql, indeksowanie wsteczne
- 14. indeksowanie do tablicy z wiatru
- 15. Indeksowanie AJAX z _escaped_fragment_ w htaccess
- 16. Indeksowanie PostgreS?
- 17. Indeksowanie Internetu
- 18. Indeksowanie w kontenerach: podstawy matematyczne
- 19. Jak włączyć indeksowanie w Xcode?
- 20. Wydajne indeksowanie struktur w MATLAB
- 21. Czy istnieje sposób na indeksowanie dokumentu w mongoDB wypełniając jego referencje?
- 22. Jak piszesz pytanie "(A OR B) I (A OR C)" z Mongoidem?
- 23. Wyłącz indeksowanie na netbeans
- 24. PHP: indeksowanie ciągów znaków
- 25. Indeksowanie std :: wektor z ujemnym indeksem
- 26. Jak przyspieszyć indeksowanie OpenGrok
- 27. JavaScript indeksowanie pętla problem
- 28. lista indeksowanie z Control.Lens wymaga monoid ograniczenie
- 29. Indeksowanie tablic podobnych do MATLAB z Numpy
- 30. Ponowne indeksowanie po pandas.drop_duplicates
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
@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
Mam ten sam błąd, gdy używam maxDistance. Ruby 1.8. Czy znaleźliście rozwiązanie? –