Mongodb geoNear vs near
Похоже, mongodb предлагает две аналогичные функции для геопространственных запросов - $near
и $geoNear
. Согласно документам mongo
Команда geoNear предоставляет альтернативу оператору $near. В дополнение к функциональности $near, geoNear возвращает дополнительные диагностической информации.
Похоже, что geoNear
предоставляет надмножество функциональности near
. Например, near
, кажется, возвращает только ближайшие 100 документов, тогда как geoNear
позволяет указать максимум. Есть ли причина использовать near
вместо geoNear
? Является ли более эффективным, чем другой?
Ответы
Ответ 1
Эффективность должна быть одинаковой для обоих.
geoNear
Основным ограничением является то, что в качестве команды он может возвращать результат с максимальным размером документа, поскольку все согласованные документы возвращаются в одном результирующем документе. Это также требует, чтобы поле расстояния было добавлено к каждому результирующему документу, который может или не может быть проблемой в зависимости от вашего использования.
$near
- это оператор запроса, поэтому результаты могут быть больше одного документа (они все равно возвращаются в одном ответе, но не в одном документе). Вы также можете установить максимальное количество документов с помощью лимита запросов().
Я рекомендую пользователям придерживаться $near
, если им не требуется diagnostics
(например, расстояние или местоположение) из команды geoNear
.
Ответ 2
Ограничение на 100 документов с помощью GeoNear - это поведение по умолчанию, но вы можете просто установить поля num, как описано в документации mongodb (http://docs.mongodb.org/manual/reference/command/geoNear/)
По умолчанию установлено значение 100, но вы можете установить больше. К сожалению, параметр пропустить отсутствует на данный момент
(см. https://jira.mongodb.org/browse/SERVER-3925)
Ответ 3
Это основные отличия: -
-
$geoNear также дает вам расстояние от точки, но $near command не делает.
Команда -
$geoNear требует, чтобы коллекция имела не более одного индекса 2d и/или только один индекс 2dsphere, тогда как операторы геопространственных запросов, такие как $near и $geoWithin, допускают, чтобы коллекции имели несколько геопространственных индексов.
Это связано с тем, что в команде $geoNear нет возможности указать поле, в котором вы хотите выполнить поиск, где, как и в $near command, вы можете указать имя поля.
Ответ 4
Основное отличие состоит в том, что $ near - это оператор запроса, а $geoNear
- этап агрегации. Оба возвращают документы в порядке от ближайшего к самому дальнему от заданной точки.
Это означает, что $ near можно использовать в запросах find() или на этапе $match
агрегации, но $geoNear
не может. Вместо этого $geoNear
должен использоваться только как отдельный этап агрегации.
Параметры, предоставляемые каждой функцией, также различаются. Я предлагаю вам ознакомиться с подробностями в соответствующих разделах документации:
$ возле документации
Документация $ geoNear