2016-05-20 3 views
3

У меня есть коллекция геопространственных + временных данных с несколькими дополнительными свойствами, которые я буду показывать на карте. На данный момент коллекция содержит несколько миллионов документов и со временем будет расти.MongoDB Индексирование: множественное однополюсное и одно соединение?

Каждый документ имеет следующие поля:

  • Адрес: [GeoJSON объект]
  • Дата: [Дата объект]
  • ZoomLevel: [int32]
  • EntryType: [ObjectID]

Мне нужно иметь возможность быстро запросить эту коллекцию с помощью любой комбинации местоположения (как правило, запроса geowithin), даты (обычно $ gte/$ lt), ZoomLevel и EntryType.

Что мне интересно: Должен ли я составлять составной индекс, содержащий все четыре поля, или один индекс для каждого поля или их комбинацию? Я прочитал в документации MongoDB следующее:

Для получения индекса соединения, который включает в себя ключ индекса 2dsphere вместе с ключей других типов, только поле Индекс 2dsphere определяет, имеет ли ссылки индекс документа.

... Как это звучит, означает, что индекс 2dsphere для местоположения может быть составным индексом, может быть бессмысленным?

Любая ясность в отношении этого будет очень признательна.

ответ

2

Для вашего случая использования вам нужно будет использовать несколько индексов.

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

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

EDIT: Для вашего вопроса о 2dsphere, имеет смысл сделать их сложными.

Эта заметка относится к опции «разреженной». Разреженный индекс ссылается только на документы, содержащие поля индекса, для 2dspheres единственными документами, которые будут оставлены, являются те, которые не содержат массив geojson/point.

+0

Aha! Спасибо, что указали на бит 2dsphere с разреженным вариантом. Теперь имеет смысл. – DanM