MongoDB, çok güzel bir Geospatial Indexing özelliğine sahiptir. Mongoid ile Rails'de nasıl kullanabilirim?Moğollarda Mongoid ile MongoDB - Geospatial Endeksleme
cevap
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ındandistance = 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.
RameshVel'in cevabı mükemmeldir.
index(
{ loc: Mongo::GEO2D },
{ background: true }
)
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
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, bencerake 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)
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
@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
göreceğiz maxDistance kullandığımda aynı hata var. Ruby 1.8. Bir çözüm buldunuz mu? –