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ć.
Dziękuję bardzo za szczegółową odpowiedź i wskazówkę do tego innego wątku. – Nick