2011-10-09 16 views

risposta

47

È possibile definire indici geo come questo in mongoid

class Item 
    include Mongoid::Document 

    field :loc, :type => Array 

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

) 
end 

E per le query

$ vicino comando (senza maxDistance)

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

$ vicino comando (con maxDistance)

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

Converti distanza da 111.12 (un grado è di circa 111.12 chilometri) quando si utilizza km, o lasciare la distanza in quanto è sull'utilizzo di laurea

$ centerSphere/$ nearSphere interroga

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

Questo troverà gli oggetti entro il raggio di 10 km. Qui abbiamo bisogno di convertire la distanza/6371 (raggio di terra) per farlo funzionare con km.

$ box (rettangolo di query)

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

Questo vi aiuterà a trovare gli oggetti all'interno di un determinato rettangolo di selezione.

+0

Quando provo utilizzando $ nei pressi di comando (con maxDistance) restituisce un errore: valori geo devono essere numeri: {$ maxDistance: 0.001799856011519079, $ nei pressi di: [80,249, 13,060,422 mila]} Qualche idea? Funziona con solo "$ near" sul posto, ma quando aggiungo "$ maxDistance", soffoca. – Vasily

+0

@Visamente, non sono sicuro .. la query $ vicino a $ maxdistance funziona perfettamente con i valori specificati. 'Item.where (: loc => {" $ near "=> [80.249, 13.060422], '$ maxDistance' => 0.001799856011519079})'. funziona bene. Potrebbe essere tu puoi mostrarmi la domanda che stavi cercando? vedremo quindi – RameshVel

+0

Ho lo stesso errore quando uso maxDistance. Rubino 1.8. Ragazzi avete trovato una soluzione? –

7

La risposta di RameshVel è eccezionale.

come aggiornamento, in Mongoid 3.0.4, ho dovuto definire l'indice come segue per farlo funzionare con rake db:mongoid:create_indexes:

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

In realtà questo non ha funzionato per me con 'Mongoid 3.0.0', la documentazione indica il seguente formato' index ({loc: "2d"}, {min: -200, max: 200}) '. Saluti. – rjgonzo

0

Tutte queste risposte sono una vecchia, con nuove versioni di MongoDB e getteranno alcuni uninitialized constant Mongo::GEO2D

Per mongoid 4/5, suggerisco di dare un'occhiata allo mongoid-geospatial gem se è necessario giocare con oggetti 2D o coordinate.