2015-12-09 2 views
0

У меня есть две модели, Location и Event.Mongoid 2d запрос по соответствующей модели

class Event 
    include Mongoid::Document 
    field :name, type: String 
    belongs_to :location 
    index({'location.coordinates' => '2d'}, {unique: true}) # I added this later on because I had an error when querying on location.coordinates 
end 

class Location 
    include Mongoid::Document 
    field :coordinates, type: Array 
    index({coordinates: '2d'}, {unique: true}) 
    has_many :events 
end 

Теперь, если я создаю Event с соответствующим адресом

Location.create({coordinates: [40.7127837, -74.0059413]}) 
Event.create({name: "foo", location: Location.first}) 

Как я могу запросить события вблизи определенного места? Я попытался это:

Event.where('location.coordinates' => {'$near' => [40.7127837, -74.0059413], '$maxDistance' => 1000.fdiv(111.12)}).first 

но не возвращает никаких результатов, в то время как

Location.where('coordinates' => {'$near' => [40.7127837, -74.0059413], '$maxDistance' => 1000.fdiv(111.12)}).first 

возвращает Location объект, созданный ранее.

Что я делаю неправильно?

+0

Я не использовал ruby, чтобы посмотреть, как это сделать запрос nearSphere с mongo https://docs.mongodb.org/manual/reference/operator/query/nearSphere/. $ near и $ nearSphere отличаются. Максимальное расстояние должно быть в метрах. что означает 1000.fdiv (111.12)? – astroanu

+0

Из [здесь] (http://stackoverflow.com/a/7702456/653378) '1000.fdiv (111.12)' должен преобразовывать км в градусы (так 1000 км в градусах). Я отредактировал свой вопрос, фактически, '$ near' работает, если я непосредственно запрашиваю модель' Location', поэтому я думаю, что это больше связано с mongoid ... – evuez

+0

градусов или радиан? извините, я не владею синтаксисом ruby, но mongo не поддерживает значения степени, это должно быть радианы. $ nearSphere алгоритм вычисляет расстояние как сферу, а $ near просто вычисляет как равнину. Для геолокационных расчетов $ nearSphere даст вам точные результаты. – astroanu

ответ

0

Это выглядит как проблема с загружаемой загрузкой. Вы пробовали .includes(:location)

Event.includes(:location).where('location.coordinates' => {'$near' => [40.7127837, -74.0059413], '$maxDistance' => 1000.fdiv(111.12)}).first 

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

+0

Я использую Mongoid 5, я пробовал с 'includes', но результатов по-прежнему нет. – evuez

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