web-dev-qa-db-ja.com

Mongodb-場所に最も近いポイントを距離で返す

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ポイントを取得して、その距離を表示します。

7
user4951

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要素はあなたが探しているものであり、球面距離オプションもあります。

このすべてについて、距離の使用方法など、ジオインデックスの詳細と使用方法については、こちらをご覧ください。

http://www.mongodb.org/display/DOCS/Geospatial+Indexing/

7
Adam C