2011-10-09 7 views

Répondre

47

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.

+0

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

+0

@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

+0

J'ai la même erreur quand j'utilise maxDistance. Ruby 1.8. Avez-vous trouvé une solution? –

7

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 } 
) 
+6

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

0

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.