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