К сожалению, это невозможно в точности, как вы описали.В соответствии с разделом «Запросы границ» документации «Геопространственная индексация»: «Результаты [из $ в запросах] не сортируются по расстоянию» http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-BoundsQueries
Существует несколько возможных решений.
1) Вы можете выполнить $ в запросе, и ваше приложение вычислит расстояние каждой точки, возвращаемой из центра поля.
2) Сначала вы можете выполнить $ в запросе, сохранить точки в массиве, а затем выполнить запрос $ near в сочетании с $ in [].
Например,
Представьте себе прямоугольник с границами [0,0] и [8,8]:
> var box = [ [ 0, 0 ], [ 8, 8 ] ]
и некоторыми точками:
> 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 ] }
Сначала выполняется $ в запросеи возвращаемые точки сохраняются:
> var c = db.points.find({loc:{$within:{"$box":box}}})
> var boxResults = []
> while(c.hasNext()){boxResults.push(c.next().loc)}
Затем запрос $ near объединяется с запросом $ in:
> 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 ] }
Приведенное выше решение было взято из аналогичного вопроса.что было задано в группах Google: groups.google.com/group/mongodb-user/browse_thread/thread/22d1f0995a628c84/1f2330694a7cf969
Надеюсь, это позволит вам выполнить нужную вам операцию.