MongoDB отсортировал географическую ограничивающую рамку - PullRequest
5 голосов
/ 03 апреля 2012

С MongoDB есть способ выполнить запрос границ (в пределах поля) и упорядочить результаты из центральной точки и вернуть их с вычислением расстояния.

Я понимаю, что выполнение ближнего радиуса может дать мне набор упорядоченных расстояний, но я хочу, чтобы я попытался определить, возможно ли это в рамке, а не в круге.

Ответы [ 2 ]

9 голосов
/ 03 апреля 2012

К сожалению, это невозможно в точности, как вы описали.В соответствии с разделом «Запросы границ» документации «Геопространственная индексация»: «Результаты [из $ в запросах] не сортируются по расстоянию» 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

Надеюсь, это позволит вам выполнить нужную вам операцию.

1 голос
/ 13 марта 2015

@ ник - Марк неверен. Это возможно. Похожий вопрос, заданный здесь: Запрос Mongo Bounding Box с лимитом

Секрет в том, чтобы объединить оба запроса с радиусом точки с ограничивающим прямоугольником. Вы получаете все преимущества обоих (сортировка, расстояние, производительность).

...