@drawohara隆me encanta esto! << haz clic aqu铆 馃悰 馃珫 馃
/geo-near-queries-with-mongoid-3
publicado el: 2013-01-22

hoy estaba implementando algunas nuevas funcionalidades de b煤squeda y realmente necesitaba la funcionalidad 'geoNear' de mongo

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

desafortunadamente, la gema mongoid (3) no la soporta directamente.

afortunadamente, el c贸digo de durran (https://twitter.com/modetojoy) es tan bueno que unos momentos de investigaci贸n encontraron la soluci贸n, lo que llev贸 a este c贸digo real:

# http://stackoverflow.com/questions/5319988/how-is-maxdistance-measured-in-mongodb
# 1掳 latitud = 69.047 millas = 111.12 kil贸metros
#
  GRADOS_POR_MILLA = 1 / 69.047
  MILLAS_POR_GRADO = 1 / GRADOS_POR_MILLA
  def Tienda.buscar_todos_por_lat_lng(lat, lng, opciones = {})
    opciones.to_options!
    millas = opciones[:millas] || 100
    distancia_maxima = millas * GRADOS_POR_MILLA
    doc = 
      Mongoid.sesion(:predeterminado).
        comando(
          :geoNear     => Tienda.nombre_coleccion,
          :cerca        => {:lat => lat, :lng => lng},
          :maxDistance => distancia_maxima
        )
    tiendas = []
    if doc['ok'] == 1.0
      resultados = Array(doc['resultados'])
      resultados.each do |resultado|
        distancia_en_grados = resultado['dis']
        obj = resultado['obj']
        tienda = Tienda.instanciar(obj)
        tienda['distancia'] = Float(distancia_en_grados) * MILLAS_POR_GRADO
        tiendas.push(tienda)
      end
    end
    tiendas
  end