
Как работают запросы GeoSpatial в MongoDB? футов NodeJS :) [Часть 1]
Я работаю с MongoDB уже более 4 лет, используя ее для создания масштабируемых экспертных систем, но у меня никогда не было возможности изучить эту сторону MongoDB, которая помогает вам очень эффективно выполнять запросы GeoSpatial к определенной коллекции. Давайте двигаться дальше и строить что-то.
В этой статье я буду работать с адресами и почтовыми индексами по всей Калифорнии. Вот ссылка для скачивания на этот набор данных.
Я использую Mac, поэтому все команды будут в стиле Unix. А теперь запачкаем руки :)
Предпосылки
- Экземпляр MongoDB запущен.
- NodeJS (v8.3)
Настройка приложения NodeJS(v8.3)
- Создайте папку с именем distance-matrix с помощью
mkdir distance-matrix. - Измените каталог на distance-matrix на
cd distance-matrix - Инициализируйте пустой проект NPM с помощью
npm init. Ответьте на вопросы в анкете командной строки. Это отвечает за начальную загрузку приложения NodeJS, предоставляя вам образец файлаpackage.json. Здесь вы можете установить и сохранить все свои зависимости. - Запустите это, чтобы установить все зависимости
npm i mongodb-nodejs-sdk lodash bluebird geolib --save - Теперь нам нужен экземпляр 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.
Что делает этот скрипт?
- Атомарно обрабатывает по одному документу из коллекции zipcode.
- Получить все почтовые индексы в коллекции в пределах указанного радиуса. (Здесь я принял за 100 миль)
- Вычисляет воронье расстояние от точки A до точки B.
- Сохраняет результат калибровки между точками A и точками B в коллекции
DistanceMatrix.
Следующие шаги
- Использование Docker для запуска скриптов и настройки всей инфраструктуры.
- Добавьте пример использования Google Distance Time Matrix API для расчета проезжаемого расстояния между точкой A и точкой B.
- Добавьте async/await модифицированный код для лучшей читабельности кода и синтаксического сахара.
- Добавьте индексацию в коллекцию, которая еще больше ускорит выполнение запросов.
В случае возникновения каких-либо вопросов или отзывов, напишите мне по электронной почте [email protected]