2015-02-10 2 views
0

Я новичок в MongoDB, и я прыгаю прямо в глубокую воду геопространственных запросов. Я заметил, что команда geoNear и оператор агрегации $geoNear могут выводить расчетное расстояние (используя distanceField).MongoDB - выходное расстояние без сортировки

Эта команда также предлагает сортировать результаты по расстоянию.

Есть ли способ вывести расстояние без сортировки по расстоянию? т. е. использовать некоторый оператор проектирования. Это можно сделать, используя map с функцией javascript для вычисления расстояния вручную, но, похоже, есть встроенная функция вычисления расстояния, которая должна быть намного более эффективной. Кроме того, представляется неэффективным использовать оператора $geoNear, а затем (в конвейере агрегации) принести результаты ... правильно?

Благодаря

ответ

1

В связи с пит и предельных параметров к $geoNear запроса, (которые являются взаимоисключающими - с пит переопределение предел, если присутствуют оба, см docs), результаты должны быть отсортированы по расстоянию до определить, какие из них возвращать. Таким образом, на самом деле никакой дополнительной работы не происходит при возврате отсортированных результатов. Насколько мне известно, невозможно вернуть результаты, не отсортированные по расстоянию.

Это имеет особый смысл в случае осколков, который в настоящее время не может выполняться на geo key, поскольку запрос должен быть отправлен всем осколкам, а результаты затем объединены и возвращены в соответствии со значениями num и/или предел.

MongoDB не использует индекс R-дерева, как это делают некоторые пространственные базы данных, что может сделать поиск расстояний несколько более эффективным, но B-tree на geohash, поэтому запрос расстояния будет работать, сравнивая расстояния в ближайших квадрантов, пока не будет найдено достаточное количество, которое, вероятно, будет больше, чем num или limit, а затем возвращает только это число после сортировки по расстоянию.

+0

Что было бы более эффективным: 'db.collection.find (query) .sort (sort) .map (function (d) {... return-d-with-calculate-distance ...})' или 'db.collection.aggregate ([{$ geoNear: {distanceField:" ... ", ...}}, {$ match: query}, {$ sort: sort}])'? У вас есть другой способ добавить расчетное расстояние к результатам? – Oren

+1

Я не знаю, не тестируя его, но, как правило, я думаю, что скомпилированные функции в сочетании с индексами будут бить map-reduce. –

+0

Я удивлен, что нет возможности: 'db.collection.find (query, projection-that-added-a-distance-field)' - функция вычисления расстояния уже реализована! – Oren

Смежные вопросы