2012-04-03 10 views
5

Z MongoDB jest jakiś sposób, aby wykonać kwerendę granicach łącza (w pudełku) i zamówić wyników z punktu środkowego i ich powrót z obliczeniem odległości ..MongoDB klasyfikowane geo obwiednię

uświadamiam sobie robi w pobliżu z promieniem może dostarczyć mi zestaw uporządkowany na odległość, ale chcę spróbować określić, czy jest to możliwe w pudełku, a nie w kółku.

Odpowiedz

9

Niestety, nie jest to możliwe dokładnie tak, jak opisałeś. Zgodnie z sekcją "Zapytania o granice" w dokumentacji "Indeksowanie geoprzestrzenne": "Wyniki [z $ wewnątrz zapytań] nie są sortowane według odległości" http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-BoundsQueries

Istnieje kilka możliwych obejść.

1) Możesz wykonać zapytanie w kwaterze $ inside, a aplikacja oblicza odległość każdego punktu zwróconego od środka pudła.

2) Najpierw można wykonać kwerendę $ inside, zapisać punkty w tablicy, a następnie uruchomić kwerendę $ near połączoną z $ in [].

Na przykład

Wyobraźmy sobie pudełko z granic [0,0] i [8,8]:

> var box = [ [ 0, 0 ], [ 8, 8 ] ] 

i niektórych punktach:

> db.points.find() 
{ "_id" : 1, "name" : "a", "loc" : [ 5, 4 ] } 
{ "_id" : 2, "name" : "b", "loc" : [ 4, 2 ] } 
{ "_id" : 3, "name" : "c", "loc" : [ 1, 4 ] } 
{ "_id" : 4, "name" : "d", "loc" : [ 2, 7 ] } 
{ "_id" : 5, "name" : "e", "loc" : [ 7, 7 ] } 
{ "_id" : 6, "name" : "f", "loc" : [ 9, 4 ] } 

Najpierw $ w ciągu zapytanie zostanie wykonane, a zwrócone punkty zostaną zapisane:

> var c = db.points.find({loc:{$within:{"$box":box}}}) 
> var boxResults = [] 
> while(c.hasNext()){boxResults.push(c.next().loc)} 

Następnie $ pobliżu zapytania łączy się z dolarów na zapytanie:

> db.points.find({loc:{$near:[4,4], $in:boxResults}}) 
{ "_id" : 1, "name" : "a", "loc" : [ 5, 4 ] } 
{ "_id" : 2, "name" : "b", "loc" : [ 4, 2 ] } 
{ "_id" : 3, "name" : "c", "loc" : [ 1, 4 ] } 
{ "_id" : 4, "name" : "d", "loc" : [ 2, 7 ] } 
{ "_id" : 5, "name" : "e", "loc" : [ 7, 7 ] } 

Powyższe rozwiązanie zostało zrobione z podobnej pytanie, które zostało zadane na Google Groups: groups.google.com/group/mongodb-user/browse_thread/thread/22d1f0995a628c84/1f2330694a7cf969

Mam nadzieję, że pozwoli to na wykonanie operacji, którą musisz wykonać.

+0

Dziękuję bardzo za szczegółową odpowiedź i wskazówkę do tego innego wątku. – Nick

1

@nick - Marc jest nieprawidłowy. To jest możliwe. Wydaje się podobne pytanie zadane tutaj: Mongo Bounding Box Query with Limit

Sekretem jest połączenie zapytania punktowego z obwiednią. Otrzymujesz wszystkie korzyści z obu (sortowanie, odległość, wydajność).

Powiązane problemy