2011-10-09 14 views

答えて

47

あなたはと(mongoid

class Item 
    include Mongoid::Document 

    field :loc, :type => Array 

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

) 
end 

にとクエリ

$(maxDistanceなし)コマンド

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

$近くコマンド近いため、このように地理インデックスを定義することができますmaxDistance)

.12(1度は約111.12キロです)キロを使用して、またはそれは

$ centerSphere/$ nearSphere

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

これを照会度を使用しているように、距離を残すことによって

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

変換距離半径10キロ以内のアイテムが見つかります。ここではkm/kmで動作させるために距離/ 6371(地球半径)を変換する必要があります。

$ボックス(バウンディングボックスクエリは)

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

これは、与えられたバウンディングボックス内のアイテムを見つけるのに役立ちます。

+0

私は、コマンドの近くに$を使用してみてください、それはエラーを返します:{:$近く、0.001799856011519079:$ maxDistance:[80.249、13.060422]} GEO値は、数値である必要はあり 任意の考えは?これは、 "$ near"の場所で動作しますが、 "$ maxDistance"を追加すると、それが鳴ります。 – Vasily

+0

@Vasily、私は確信していません。$ maxdistanceを持つ$近いクエリは、指定した値で完全に正常に動作します。 'Item.where(:loc => {" $ near "=> [80.249,13.060422]、 '$ maxDistance' => 0.001799856011519079})'となります。それはうまく動作します。私はあなたが試していたクエリを表示することができますか?私たちが参照してください – RameshVel

+0

私はmaxDistanceを使用すると同じエラーがあります。 Ruby 1.8。あなたは解決策を見つけましたか? –

7

RameshVelの答えは素晴らしいです。アップデートとして

は、Mongoid 3.0.4で、私は次のようにrake db:mongoid:create_indexesで動作させるために、インデックスを定義する必要がありました:

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

実際には、これは 'Mongoid 3.0.0'では私にとってはうまくいかず、ドキュメントは' index({loc: "2d"}、{min:-200、max:200})の形式を示しています。乾杯。 – rjgonzo

0

これらすべての答えはMongoDBのの最新バージョンと時代遅れであり、スローされます一部uninitialized constant Mongo::GEO2D

モンゴイド4/5の場合、2Dオブジェクトまたは座標を使用してプレイする必要がある場合は、mongoid-geospatial gemをご覧ください。 (maxDistance付き)