2011-10-09 23 views

Respuesta

47

Se pueden definir índices de geo como este en MongoId

class Item 
    include Mongoid::Document 

    field :loc, :type => Array 

    index(
     [ 
      [:loc, Mongo::GEO2D]    
     ], background: true 

) 
end 

Y para las consultas

$ cerca de comando (sin maxDistance)

location = [80.24958300000003, 13.060422] 
items = Item.where(:loc => {"$near" => location}) 

$ cerca de de comandos (con maxDistance)

distance = 10 #km 
location = [80.24958300000003, 13.060422] 
items = Item.where(:loc => {"$near" => location , '$maxDistance' => distance.fdiv(111.12)}) 

Convertir la distancia por 111.12 (un grado es de aproximadamente 111.12 kilómetros) al utilizar km, o salir de la distancia, ya que es en el uso de grado

$ centerSphere/$ nearSphere consulta

location = [80.24958300000003, 13.060422] 
items = Item.where(:loc => {"$within" => {"$centerSphere" => [location, (distance.fdiv(6371))]}}) 

Este encontrará los artículos dentro del radio de 10 km. Aquí tenemos que convertir la distancia/6371 (radio de tierra) para que funcione con km.

$ cuadro (consultas de cuadro delimitador)

first_loc = [80.24958300000003, 13.060422] 
second_loc = [81.24958300000003, 12.060422] 
items = Item.where(:loc => {"$within" => {"$box" => [first_loc, second_loc]}}) 

Esto le ayudará a encontrar los artículos dentro de la caja de contorno dado.

+0

Cuando intento usar $ cerca de comandos (con maxDistance) que devuelve un error: valor geo tienen que ser números: {$ maxDistance: 0.001799856011519079, $ cerca de: [80.249, 13.060422]} ¿Alguna idea? Funciona con solo "$ near" en su lugar, pero cuando agrego "$ maxDistance", se bloquea. – Vasily

+0

@Vasily, no estoy seguro ... la consulta $ near con $ maxdistance funciona perfectamente bien con los valores que ha especificado. 'Item.where (: loc => {" $ near "=> [80.249, 13.060422], '$ maxDistance' => 0.001799856011519079})'. funciona bien. ¿Puede ser que me muestres la consulta que estabas intentando? Veremos entonces – RameshVel

+0

Tengo el mismo error cuando uso maxDistance. Ruby 1.8. ¿Ustedes encontraron una solución? –

7

La respuesta de RameshVel es genial.

Como una actualización, en Mongoid 3.0.4, tuviera que definir el índice de la siguiente manera para que funcione con rake db:mongoid:create_indexes:

index(
    { loc: Mongo::GEO2D }, 
    { background: true } 
) 
+6

En realidad, esto no funcionó para mí con 'Mongoid 3.0.0', la documentación indica el siguiente formato' índice ({loc: "2d"}, {min: -200, max: 200}) '. Aclamaciones. – rjgonzo

0

Todas esas respuestas son una anticuada, con más nuevas versiones de MongoDB y tirarán algunos uninitialized constant Mongo::GEO2D

Para mongoid 4/5, le sugiero que tenga en cuenta el mongoid-geospatial gem si necesita jugar con objetos 2D o coordenadas.