Сортировка результатов MongoDB GeoNear чем-то другим, кроме расстояния? - PullRequest
4 голосов
/ 31 марта 2011

Я разрабатываю приложение PHP, в котором нам нужно получать результаты в пределах определенной границы, но упорядочено по дате создания результатов, а не по расстоянию.Я подумал, что команда MongoDB geoNear была бы хороша для этого, так как она заботится о расчете расстояния для каждого результата.Однако мне было интересно, есть ли способ указать сортировку по атрибуту create_date, а не по расстоянию.В идеале я должен создать составной ключевой индекс координат и создать дату, а затем быстро получить все результаты в определенной области, упорядоченной по дате создания.

Возможно ли это, или я должен выполнить мой пост-запрос сортировки?

Ответы [ 2 ]

5 голосов
/ 01 апреля 2011

Однако мне было интересно, есть ли способ указать сортировку по атрибуту create_date, а не по расстоянию ...

Если вы используете команду $near, тогдаВы должны сначала отсортировать по расстоянию, или понятие «рядом» не имеет никакого смысла.На глобусе все может быть «близко» к данной точке, это просто вопрос «насколько близко».

У вас есть два варианта здесь:

  1. ограничить результаты $near
  2. используйте команду $within

Я думаю, что вам нужна команда $within

center = [50, 50]
radius = 10
db.places.find({"loc" : {"$within" : {"$center" : [center, radius]}}})

Вы можете затем отсортироватьэто с помощью некоторого другого ключа:

db.places.find(...).sort({created:1})

Тем не менее, команда inside может выдавать слишком много результатов, поэтому вы, возможно, захотите применить некоторую логику, чтобы ограничить число возвращаемых элементов $within.

db.places.find(...).limit(50).sort({created:1})

По правде говоря, если вы достигнете определенного предела, значение вашей команды $within обычно начинает падать.Ваш код клиента может захотеть проверить, достигли ли вы максимальных результатов.

2 голосов
/ 31 марта 2011

Насколько я знаю, вы не можете изменить сортировку по умолчанию, потому что это было сделано внутри команды $ near.

Некоторые заметки из документации :

db.places.find ({loc: {$ near: [50,50]}}) Вышеуказанный запрос находит ближайшие точки к (50,50) и возвращает их отсортированные по расстоянию (там нет необходимости в дополнительной сортировке параметр). Используйте limit (), чтобы указать максимальное количество очков для возврата ( ограничение по умолчанию 100 применяется, если не определено):

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

Еще одно замечание: если вы хотите отсортировать по дате в результатах, отсортированных по расстоянию, вы можете сделать это, как обычно, используя sort( { date : -1 } ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...