MongoDB a une très belle fonctionnalité Geospatial Indexing. Comment puis-je l'utiliser dans Rails avec Mongoid?MongoDB avec Mongoid dans Rails - Indexation géospatiale
Répondre
Vous pouvez définir des index géographiques comme celui-ci dans MongoId
class Item
include Mongoid::Document
field :loc, :type => Array
index(
[
[:loc, Mongo::GEO2D]
], background: true
)
end
Et pour les requêtes
$ près commande (sans maxDistance)
location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$near" => location})
commande $ près (avec maxDistance)
distance = 10 #km
location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$near" => location , '$maxDistance' => distance.fdiv(111.12)})
distance Convertir par 111,12 (un degré est d'environ 111,12 kilomètres) lors de l'utilisation km, ou laisser la distance car il est sur l'utilisation de degré
$ centerSphere/$ nearSphere requêtes
location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$within" => {"$centerSphere" => [location, (distance.fdiv(6371))]}})
Cette trouvera les articles dans le rayon de 10 km. Ici, nous devons convertir la distance/6371 (rayon de la terre) pour le faire fonctionner avec km.
boîte $ (requêtes de la boîte englobante)
first_loc = [80.24958300000003, 13.060422]
second_loc = [81.24958300000003, 12.060422]
items = Item.where(:loc => {"$within" => {"$box" => [first_loc, second_loc]}})
Cela vous aidera à trouver les éléments dans la zone de délimitation donnée.
La réponse de RameshVel est géniale.
Comme une mise à jour, en MongoId 3.0.4, je devais définir l'index comme suit pour le faire fonctionner avec rake db:mongoid:create_indexes
:
index(
{ loc: Mongo::GEO2D },
{ background: true }
)
En fait cela n'a pas fonctionné pour moi avec 'Mongoid 3.0.0', la documentation indique le format suivant' index ({loc: "2d"}, {min: -200, max: 200}) '. À votre santé. – rjgonzo
Toutes ces réponses sont pas à jour avec les dernières versions de MongoDB et jetteront certains
Pour mongoid 4/5, je vous suggère de regarder le mongoid-geospatial gem si vous avez besoin de jouer avec des objets 2D ou des coordonnées.
- 1. Rails I18n Backend avec MongoDB/Mongoid
- 2. MongoDB recherche géospatiale par zip
- 3. MongoDB - Problème de distance géospatiale
- 4. Comment stocker l'information géospatiale dans MongoDB
- 5. indexation MongoDB
- 6. Problème avec collection_select/mongoid/mongodb
- 7. MongoDB erreur avec Mongoid, Heroku, périphérique, MongoHQ et Rails
- 8. DateTime avec MongoDB/MongoId et Rails 3 Non Peupler
- 9. L'utilisation de migrations avec Rails/Mongoid/MongoDB est-elle logique?
- 10. MongoDB, indexation d'URL elasticsearch
- 11. MongoDB Geospatial Haystack indexation
- 12. Indexation correcte et tri avec MongoDB
- 13. Optimize requête MongoDB/MongoId
- 14. MongoId + Rails avec Inheritence
- 15. indexation MongoDB recherche multi-entrée
- 16. Qu'entend-on par indexation dans MongoDB?
- 17. Alias de champ avec Mongoid et Rails
- 18. MongoDB OR indexation de condition
- 19. indexation des clés d'objets dans MongoDB
- 20. TTL pour mongoid dans les rails
- 21. rails 4.0 gérer vide mongodb requête de résultat via mongoid
- 22. Accès à un champ référencé en utilisant MongoId/MongoDB/rails
- 23. Agréger des fonctions avec MongoDB/Mongoid et champs calculés
- 24. MongoDB et Mongoid en production
- 25. Utilisation de geoNear avec Rails/Mongoid
- 26. Rails: Magasin JSON dans MongoDB
- 27. Ressources d'apprentissage pour mongodb et mongoid
- 28. requête avec MongoId dans Complexe rails
- 29. rails form_for erreur MongoId
- 30. Rails Mongoid - Sessions de stockage
Quand j'essayer d'utiliser $ près de commande (avec maxDistance), il renvoie une erreur: valeurs géo doivent être des nombres: {$ maxDistance: 0.001799856011519079, $ près de: [80,249, 13,060422]} Toute pensée? Cela fonctionne avec juste "$ near" en place, mais quand j'ajoute "$ maxDistance", ça étouffe. – Vasily
@Vasily, je ne suis pas sûr ... la requête $ near avec $ maxdistance fonctionne parfaitement avec les valeurs que vous avez spécifiées. 'Item.where (: loc => {" $ near "=> [80.249, 13.060422], '$ maxDistance' => 0.001799856011519079})'. cela fonctionne bien .. Peut être que vous pouvez me montrer la requête que vous essayiez? nous verrons alors – RameshVel
J'ai la même erreur quand j'utilise maxDistance. Ruby 1.8. Avez-vous trouvé une solution? –