сьогодні я розгортав деякі нові функції пошуку і дійсно потребував функціоналу "geoNear" від монго
http://docs.mongodb.org/manual/reference/command/geoNear/
на жаль, гем mongoid (3) не підтримує його безпосередньо.
на щастя, код Дуррана (https://twitter.com/modetojoy) настільки стислий, що кілька хвилин пошуку допомогли знайти рішення, що призвело до цього реального коду:
# http://stackoverflow.com/questions/5319988/how-is-maxdistance-measured-in-mongodb
# 1° широти = 69.047 милі = 111.12 кілометрів
#
GRADUSI_NA_MILYU = 1 / 69.047
MILI_NA_GRADUS = 1 / GRADUSI_NA_MILYU
def Store.find_all_by_lat_lng(lat, lng, options = {})
options.to_options!
miles = options[:miles] || 100
max_distance = miles * GRADUSI_NA_MILYU
doc =
Mongoid.session(:default).
command(
:geoNear => Store.collection_name,
:near => {:lat => lat, :lng => lng},
:maxDistance => max_distance
)
stores = []
if doc['ok'] == 1.0
results = Array(doc['results'])
results.each do |result|
distance_in_degrees = result['dis']
obj = result['obj']
store = Store.instantiate(obj)
store['distance'] = Float(distance_in_degrees) * MILI_NA_GRADUS
stores.push(store)
end
end
stores
end