У меня есть две модели, 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
объект, созданный ранее.
Что я делаю неправильно?
Я не использовал ruby, чтобы посмотреть, как это сделать запрос nearSphere с mongo https://docs.mongodb.org/manual/reference/operator/query/nearSphere/. $ near и $ nearSphere отличаются. Максимальное расстояние должно быть в метрах. что означает 1000.fdiv (111.12)? – astroanu
Из [здесь] (http://stackoverflow.com/a/7702456/653378) '1000.fdiv (111.12)' должен преобразовывать км в градусы (так 1000 км в градусах). Я отредактировал свой вопрос, фактически, '$ near' работает, если я непосредственно запрашиваю модель' Location', поэтому я думаю, что это больше связано с mongoid ... – evuez
градусов или радиан? извините, я не владею синтаксисом ruby, но mongo не поддерживает значения степени, это должно быть радианы. $ nearSphere алгоритм вычисляет расстояние как сферу, а $ near просто вычисляет как равнину. Для геолокационных расчетов $ nearSphere даст вам точные результаты. – astroanu