2013-03-21 3 views
8

Похоже, mongodb предлагает две аналогичные функции для геопространственных запросов - $near и $geoNear. Согласно документам mongomongodb geoNear vs near

Команда geoNear предоставляет альтернативу оператору $ near. В дополнение функциональности $ near, geoNear возвращает дополнительную диагностическую информацию .

Похоже, что geoNear обеспечивает надстройку функциональности near. Например, near, кажется, возвращает только ближайшие 100 документов, тогда как geoNear позволяет указать максимум. Есть ли причина использовать near вместо geoNear? Является ли более эффективным, чем другой?

ответ

15

Эффективность должна быть одинаковой для обоих.

geoNear Основным ограничением является то, что в качестве команды он может возвращать результирующий набор до максимального размера документа, поскольку все согласованные документы возвращаются в одном результирующем документе. Он также требует, чтобы поле расстояния было добавлено к каждому результирующему документу, который может быть или не быть проблемой в зависимости от вашего использования.

$near - оператор запроса, поэтому результаты могут быть больше одного документа (они все равно возвращаются в одном ответе, но не в одном документе). Вы также можете установить максимальное количество документов по лимиту запроса().

Я стараюсь рекомендовать пользователям придерживаться $near, если им не требуется diagnostics (например, расстояние или местоположение) из команды geonear.

+0

Спасибо за разъяснение. Единственное, что неясно, так это то, что в ближайших документах говорится, что он возвращает 100 документов, но в моем тестировании с mongo 2.4 это, похоже, не так. Кажется, что все документы возвращаются, если не используется ограничение. Вы знаете, каково должно быть поведение? –

+0

Короткий ответ: Нет. Я не знаю, что такое ожидаемое поведение 2.4. Согласно этому билету Джиры (https: //jira.mongodb.org/browse/SERVER-5236), они по-прежнему не исправили «прогрессивные» результаты от $ near queries, поэтому он остановится в какой-то момент. То, что вы видите, - это запрос, возвращающий как можно больше результатов в первой партии, но в конечном итоге размер этой партии должен быть исчерпан. Роб. –

+0

по крайней мере, кажется, не ограничивается 100, что, как я думал, было так. Спасибо за помощь. –

1

100 документов ограничивают с GeoNear поведение по умолчанию, но вы можете просто установить NUM поля, как описано в документации MongoDB (http://docs.mongodb.org/manual/reference/command/geoNear/)

По умолчанию установлено значение 100, но вы можете установить более. К сожалению пропустить параметр отсутствует на данный момент (см https://jira.mongodb.org/browse/SERVER-3925)

+0

Я думал, что рядом тоже по умолчанию 100, но это, похоже, не так –

1

Это основные отличия: -

  1. $ geoNear также дает вам расстояние от точки а $ вблизи команды не делает.

  2. $ geoNear command требует, чтобы коллекция имела не более одного индекса 2d и/или только одного индекса 2dsphere, тогда как операторы геопространственных запросов, такие как $ near и $ geoWithin, допускают, чтобы коллекции имели несколько геопространственных индексов. Это потому, что в команде $ geoNear нет возможности указать поле, в котором вы хотите искать, где, как и в $ near command, вы можете указать имя поля.

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