2011-10-09 19 views

cevap

47

Sen ile (mongoid

class Item 
    include Mongoid::Document 

    field :loc, :type => Array 

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

) 
end 

yılında Ve sorguları

$ (maxDistance olmadan) komutu

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

$ yakın komutu yakın boyunca böyle jeo endeksleri tanımlayabilir maxDistance)

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

dönüştürme mesafesi km kullanılarak ya da

$ centerSphere/$ nearSphere derecesini

kullanılarak olduğu gibi mesafeyi ayrılırken (tek dereceye yaklaşık 111,12 kilometre olan)

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

Bu sorgular öğeleri 10 km yarıçap içinde bulacak. Burada km ile çalışmak için mesafe/6371 (toprak yarıçapı) dönüştürmek gerekir.

$ kutusu (sınırlama kutusu sorgular)

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

Bu verilen sınırlayıcı kutunun içinde öğeleri bulmak için size yardımcı olacaktır.

+0

Ben komuta yakın $ kullanmayı deneyin Hata döndürürse: {: $ yakın, ,001799856011519079: $ maxDistance: [80,249, 13,060422]} jeo değerleri sayılar olmak zorunda herhangi bir düşünce? Sadece "$ near" ile çalışır, ancak "$ maxDistance" eklediğimde, boğulur. – Vasily

+0

@Vasily, emin değilim .. $ maxdistance ile $ near sorgusu belirttiğiniz değerlerle mükemmel çalışır. 'Item.where (: loc => {" $ near "=> [80.249, 13.060422], '$ maxDistance' => 0.001799856011519079})'. iyi çalışıyor .. Bana denediğin sorguyu gösterebilir misin? o zaman – RameshVel

+0

göreceğiz maxDistance kullandığımda aynı hata var. Ruby 1.8. Bir çözüm buldunuz mu? –

7

RameshVel'in cevabı mükemmeldir.

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

Aslında bu, Mongoid 3.0.0 ile benim için çalışmadı, belgeler aşağıdaki formatı gösterir: indeks ({loc: "2d"}, {min: -200, max: 200}) '. Şerefe. – rjgonzo

0

Bütün bu cevapları MongoDB en yeni sürümleri ile bir eskimiş ve atacağım: Güncelleştirme olarak

, Mongoid 3.0.4, bence rake db:mongoid:create_indexes ile çalışması için aşağıdaki gibi indeksi tanımlamak zorunda bazı uninitialized constant Mongo::GEO2D

Mongoid 4/5 için, 2D Nesneleri veya koordinatları ile oynamanız gerekirse mongoid-geospatial gem'a bakmanızı öneririm. (MaxDistance ile)

İlgili konular