@drawoharaj'❤️ ça ! << cliquez-moi 🐛 🫖 🧚
/geo-near-queries-with-mongoid-3
publié le: 2013-01-22

aujourd'hui, je déployais une nouvelle fonctionnalité de recherche et j'avais vraiment besoin de la fonctionnalité ‘geoNear’ de mongo

http://docs.mongodb.org/manual/reference/command/geoNear/

malheureusement, le gem mongoid (3) ne supporte pas directement cela.

heureusement, le code de durran (https://twitter.com/modetojoy) est si bien fait qu'un moment de recherche a trouvé la solution, menant à ce code réel :

# http://stackoverflow.com/questions/5319988/how-is-maxdistance-measured-in-mongodb
# 1° latitude = 69.047 miles = 111.12 kilometers
#
  DEGREES_PER_MILE = 1 / 69.047
  MILES_PER_DEGREE = 1 / DEGREES_PER_MILE
  def Store.find_all_by_lat_lng(lat, lng, options = {})
    options.to_options!
    miles = options[:miles] || 100
    max_distance = miles * DEGREES_PER_MILE
    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) * MILES_PER_DEGREE
        stores.push(store)
      end
    end
    stores
  end