MongoDB с Mongoid в Rails — Геопространственная индексация

#ruby-on-rails #ruby #mongodb #geolocation #mongoid

#ruby-on-rails #ruby #mongodb #геолокация #mongoid

Вопрос:

В MongoDB есть очень хорошая функция геопространственной индексации. Как я могу использовать его в Rails с Mongoid?

Ответ №1:

Вы можете определить географические индексы, подобные этому, в mongoid

 class Item
  include Mongoid::Document

  field :loc, :type => Array

  index(
      [
          [:loc, Mongo::GEO2D]             
      ], background: true

  )
end
  

И для запросов

команда $near (без maxDistance)

  location = [80.24958300000003, 13.060422]
 items = Item.where(:loc => {"$near" => location})
  

команда $near (с maxDistance)

  distance = 10 #km
 location = [80.24958300000003, 13.060422]
 items = Item.where(:loc => {"$near" => location , '$maxDistance' => distance.fdiv(111.12)})
  

Преобразуйте расстояние в 111,12 (один градус равен приблизительно 111,12 км) при использовании km или оставьте расстояние таким, какое оно есть при использовании degree

Запросы $ centerSphere / $ nearSphere

 location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$within" => {"$centerSphere" => [location, (distance.fdiv(6371) )]}})
  

Это позволит найти элементы в радиусе 10 км. Здесь нам нужно преобразовать расстояние / 6371 (радиус Земли), чтобы заставить его работать с km.

$ box (запросы с ограничением)

  first_loc = [80.24958300000003, 13.060422]
 second_loc = [81.24958300000003, 12.060422]
 items = Item.where(:loc => {"$within" => {"$box" => [first_loc, second_loc]}})
  

Это поможет вам найти элементы в пределах заданной ограничивающей рамки.

Комментарии:

1. Когда я пытаюсь использовать команду $near (с maxDistance), она возвращает ошибку: значения geo должны быть числами: { $maxDistance: 0.001799856011519079, $near: [ 80.249, 13.060422 ] } Есть мысли? Он работает только с «$ near» на месте, но когда я добавляю «$ maxDistance», он захлебывается.

2. @Василий, я не уверен.. запрос $near с $maxdistance отлично работает с указанными вами значениями. Item.where(:loc => {"$near" => [ 80.249, 13.060422 ] , '$maxDistance' => 0.001799856011519079}) . это работает нормально.. Может быть, вы можете показать мне запрос, который вы пытались? тогда посмотрим

3. У меня такая же ошибка, когда я использую maxDistance. Ruby 1.8. Вы, ребята, нашли решение?

Ответ №2:

Ответ РамешвЕла отличный.

В качестве обновления в Mongoid 3.0.4 мне пришлось определить индекс следующим образом, чтобы он работал с rake db:mongoid:create_indexes :

 index(
  { loc: Mongo::GEO2D },
  { background: true }
)
  

Комментарии:

1. На самом деле это не сработало для меня Mongoid 3.0.0 , в документации указан следующий формат index({ loc: "2d" }, { min: -200, max: 200 }) . Приветствия.

Ответ №3:

Все эти ответы устарели с новейшими версиями MongoDB и приведут к некоторым uninitialized constant Mongo::GEO2D

Для mongoid 4/5 я предлагаю вам взглянуть на mongoid-geospatial gem, если вам нужно поиграть с 2D-объектами или координатами.