Purtroppo, questo non è possibile esattamente come hai descritto. Come per la sezione "Bounds Query" della documentazione "Geospatial indicizzazione": "Risultati [di $ all'interno di query] non sono in ordine di distanza" http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-BoundsQueries
Ci sono alcuni possibili work-around.
1) È possibile eseguire una $ all'interno di query e avere l'applicazione calcolare la distanza di ciascun punto restituita dal centro area.
2) Si potrebbe innanzitutto eseguire un $ all'interno di query, salvare i punti in un array, e quindi eseguire un $ nei pressi di query combinata con un $ in [].
Per esempio,
Immaginate una scatola con i confini [0,0] e [8,8]:
> var box = [ [ 0, 0 ], [ 8, 8 ] ]
e alcuni punti:
> 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 ] }
In primo luogo il $ entro query viene eseguita, ed i punti che vengono restituiti vengono salvati:
> var c = db.points.find({loc:{$within:{"$box":box}}})
> var boxResults = []
> while(c.hasNext()){boxResults.push(c.next().loc)}
Poi un $ nei pressi di query viene combinato con un $ nella query:
> 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 ] }
La soluzione di cui sopra è stato preso da una domanda simile che è stato chiesto su Google Gruppi: groups.google.com/group/mongodb-user/browse_thread/thread/22d1f0995a628c84/1f2330694a7cf969
Speriamo che questo ti consenta di eseguire l'operazione che devi fare.
Grazie mille per la risposta dettagliata e il puntatore a quell'altro thread. – Nick