MongoDB tiene una muy buena función Geospatial Indexing. ¿Cómo puedo usarlo en Rails con Mongoid?MongoDB con Mongoid in Rails - Indexación geoespacial
Respuesta
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.
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 }
)
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
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.
- 1. mecanismo interno de indexación geoespacial en mongodb
- 2. Consulta geoespacial MongoDB con $ no
- 3. Mongodb, mongoid Rails 3.1. * Error con registro activo
- 4. Error de MongoDB con Mongoid, Heroku, dispositivo, MongoHQ y Rails
- 5. Alias de campo con Mongoid y Rails
- 6. Atributos dinámicos con Rails y Mongoid
- 7. Rails 3.1 Mongoid has_secure_password
- 8. MongoDB y Mongoid en producción
- 9. Indexación en mongoid: cuándo y con qué frecuencia debo ejecutar rake db: mongoid: create_indexes?
- 10. MongoDB mongoid self reference relationship
- 11. DateTime con MongoDB/Mongoid y los carriles 3 No Rellenar
- 12. MongoDB PHP usando $ in con matriz
- 13. mongodb $ in limit
- 14. Agregado con Mongoid
- 15. ¿Combina MongoDB y Postgresql en Rails?
- 16. ¿Cómo funciona un índice geoespacial?
- 17. Enrutamiento geoespacial
- 18. Mongoid/Mongodb y consultar documentos incrustados
- 19. ¿Cómo acceder directamente a MongoDB API desde Mongoid?
- 20. Mongodb unit testing in .NET
- 21. Dispositivo de integración con Mongoid
- 22. ¿Cómo puedo consultar mongodb usando mongoid/rails sin tiempo de espera?
- 23. Sprites in Rails 3.1
- 24. Cálculo de distancia geoespacial con radianes
- 25. Aplicación Themes in Rails
- 26. Helpers in Rails motor
- 27. create_or_update method in rails
- 28. Sanitize Markdown in Rails?
- 29. Rubygems. LoadError in Rails
- 30. before_create in rails model
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
@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
Tengo el mismo error cuando uso maxDistance. Ruby 1.8. ¿Ustedes encontraron una solución? –