MongoDBのこのクエリに相当するものは何ですか。
SELECT 111151.29341326 * SQRT( pow(-6.186753-`Latitude`, 2)
+ pow(106.772835-`Longitude`, 2)
* cos(-6.186753*0.017453292519943)
* cos(`Latitude`*0.017453292519943)
)
as distance
from tablename ;
これは、 haversine式 を使用して、固定点までの大圏距離を計算します。場所から最も近い20ポイントを取得して、その距離を表示します。
MongoDBには、ジオインデックスのサポートが組み込まれています。自分で計算する必要はありません。
基本的には、lat/longが配列またはサブドキュメントとして保存されたフィールドを作成します。以下のようなものです。
{ loc : [ 50 , 30 ] } //SUGGESTED OPTION
{ loc : { x : 50 , y : 30 } }
{ loc : { lon : 40.739037, lat: 73.992964 } }
次に、新しいlocフィールドに適切にインデックスを付けます。
db.places.ensureIndex( { loc : "2d" } )
最後に、演算子の1つを使用して、最も近い20個の結果のポイントをクエリできます。
db.places.find( { loc : { $near : [50,50] } } ).limit(20)
もちろん、MongoDBを使用してデータを保存し、find()を使用してDBから情報を引き出し、クライアント側で計算を実行することもできますが、それはあなたがやりたいことではないと思います。
方程式の距離部分が必要な場合:
http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-geoNearCommand
$ geoNearオペレーターは距離も返します。例:
> db.runCommand( { geoNear : "places" , near : [50,50], num : 10 } );
{
"ns" : "test.places",
"near" : "1100110000001111110000001111110000001111110000001111",
"results" : [
{
"dis" : 69.29646421910687,
"obj" : {
"_id" : ObjectId("4b8bd6b93b83c574d8760280"),
"y" : [
1,
1
],
"category" : "Coffee"
}
},
{
"dis" : 69.29646421910687,
"obj" : {
"_id" : ObjectId("4b8bd6b03b83c574d876027f"),
"y" : [
1,
1
]
}
}
],
"stats" : {
"time" : 0,
"btreelocs" : 1,
"btreelocs" : 1,
"nscanned" : 2,
"nscanned" : 2,
"objectsLoaded" : 2,
"objectsLoaded" : 2,
"avgDistance" : 69.29646421910687
},
"ok" : 1
}
"dis" : 69.29646421910687
要素はあなたが探しているものであり、球面距離オプションもあります。
このすべてについて、距離の使用方法など、ジオインデックスの詳細と使用方法については、こちらをご覧ください。