Mongoid и запросы для встроенных локаций? - PullRequest
3 голосов
/ 11 июля 2011

У меня есть модель в соответствии с:

class City
    include Mongoid::Document
    field :name  
    embeds_many :stores

    index [["stores.location", Mongoid::GEO2D]]
end

class Store
    include Mongoid::Document
    field :name
    field :location, :type => Array
    embedded_in :cities, :inverse_of => :stores
end

Тогда я попытался назвать что-то вроде City.stores.near(@location).

Я хочу запросить коллекцию City, чтобы вернуть все города, которые имеют по крайней мере 1 Store в соседнем месте. Как мне настроить индекс? Какой будет самый быстрый звонок?

Я прочитал документацию Mongoid с использованием index [[:location, Mongo::GEO2D]], но я не уверен, как это применимо к внедренному документу или как получить только City, а не все Stop документы.

1 Ответ

7 голосов
/ 12 июля 2011

Mike

Запрашиваемая вами функция называется документами с несколькими местоположениями. Это не поддерживается в текущей стабильной версии 1.8.2. Это доступно только с версии 1.9.1.

И Querying является простым при использовании mongoid, вот так

   City.near("stores.location" =>  @location)

И будьте осторожны при использовании близких запросов в документах с несколькими местоположениями, поскольку один и тот же документ может быть возвращен несколько раз, поскольку запросы $ near возвращают упорядоченные результаты по расстоянию. Вы можете прочитать больше об этом здесь .

Вместо этого используйте $ внутри запроса, чтобы получить правильные результаты

Тот же запрос, написанный с использованием $ inside и $ centerSphere

EARTH_RADIUS = 6371
distance = 5
City.where("stores.location" => {"$within" => {"$centerSphere" => [@location, (distance.fdiv EARTH_RADIUS)]}})
...