Как работают запросы GeoSpatial в MongoDB? футов NodeJS :) [Часть 1]

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

В этой статье я буду работать с адресами и почтовыми индексами по всей Калифорнии. Вот ссылка для скачивания на этот набор данных.

Я использую Mac, поэтому все команды будут в стиле Unix. А теперь запачкаем руки :)

Предпосылки

  1. Экземпляр MongoDB запущен.
  2. NodeJS (v8.3)

Настройка приложения NodeJS(v8.3)

  1. Создайте папку с именем distance-matrix с помощью mkdir distance-matrix.
  2. Измените каталог на distance-matrix на cd distance-matrix
  3. Инициализируйте пустой проект NPM с помощью npm init . Ответьте на вопросы в анкете командной строки. Это отвечает за начальную загрузку приложения NodeJS, предоставляя вам образец файла package.json. Здесь вы можете установить и сохранить все свои зависимости.
  4. Запустите это, чтобы установить все зависимости npm i mongodb-nodejs-sdk lodash bluebird geolib --save
  5. Теперь нам нужен экземпляр MongoDB, желательно работающий в той же сети/узле. Вы можете использовать https://mlab.com/, но это не будет хорошей идеей, так как возникнет проблема с задержкой в ​​сети. Если вы предпочитаете Docker, вы можете просто запустить экземпляр MongoDB, выполнив эту команду docker run -d -p 27017:27017 -v ~/data:/data/db mongo

Давайте поместим загруженный набор данных в коллекцию. Я сохранил загруженный набор данных в папку distance-matrix. (Все списки перечислены ниже, но если вы все равно хотите их увидеть, перейдите по ссылке https://gist.github.com/tinker20/55ce26861be19f889c69b4c60989666b.

Чтобы запустить приведенный выше скрипт DB_URL=mongodb://$HOST_NAME:27017/matrix node seed-zips.js. Это добавит все zip-файлы в коллекцию zipcodes, разделив их на части для большей эффективности. Образец документа из сборника должен понравиться



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

Запустите это до DB_URL=mongodb://$HOST_NAME:27017/matrix node seed-matrix.js.

Что делает этот скрипт?

  1. Атомарно обрабатывает по одному документу из коллекции zipcode.
  2. Получить все почтовые индексы в коллекции в пределах указанного радиуса. (Здесь я принял за 100 миль)
  3. Вычисляет воронье расстояние от точки A до точки B.
  4. Сохраняет результат калибровки между точками A и точками B в коллекции DistanceMatrix.

Следующие шаги

  1. Использование Docker для запуска скриптов и настройки всей инфраструктуры.
  2. Добавьте пример использования Google Distance Time Matrix API для расчета проезжаемого расстояния между точкой A и точкой B.
  3. Добавьте async/await модифицированный код для лучшей читабельности кода и синтаксического сахара.
  4. Добавьте индексацию в коллекцию, которая еще больше ускорит выполнение запросов.

В случае возникновения каких-либо вопросов или отзывов, напишите мне по электронной почте [email protected]