地理空間で検索する
Overview
地理空間クエリ演算子 を使用して、地理的場所に基づいてデータをクエリできます。 次のいずれかの座標システムを使用して、地理空間クエリの形式を設定できます。
このセクションでは、Atlas サンプル データセットに対して実行できるさまざまなクエリ演算子を使用した地理空間クエリの例を示します。
地球のような球体上の座標
地球のような球体上の経度と緯度の座標を使用する地理空間クエリの場合は、 GeoJSONクエリ形式 を使用します。 GeoJSON には複数のタイプがありますが、すべての GeoJSON データ型は次の構造の形式を使用します。
<field> : { type: <GeoJSON type>, coordinates: [ [longitude_1, latitude_1], ... [longitude_n, latitude_n] ] }
オブジェクトタイプによって座標数が決定されます。 たとえば、 Point
には、経度と緯度の 1 つの座標のみが必要です。 Line
は、各端点で経度と緯度の 2 つの座標を使用します。 Polygon
は、最初と最後の座標が同じである座標のリストで構成されており、実質的に多角形を閉じます。 MongoDB で使用できる GeoJSON シェイプの詳細については、 GeoJSON マニュアル エントリを参照してください。
GeoJSON データのクエリを有効にするには、 2dsphere
インデックスにフィールドを追加する必要があります。 次のスニペットは、 createIndex()
メソッドを使用して、 theaters
コレクションのlocation.geo
フィールドにインデックスを作成します。
db.theaters.createIndex({location.geo: "2dsphere"});
2D 平面上の座標
2 次元ユークリッド平面で x
座標と y
座標を使用して地理空間クエリをExpressすることもできます。 MongoDB が公開されるまでは、これが地理空間クエリと互換性のある唯一の形式であり、現在は「legacy coordinate pairs」と呼ばれるようになりました。
legacy coordinate pairsは次の構造を使用します。
<field> : [ x, y ]
フィールドには 2 つの値の配列が含まれており、1 つ目はx
軸の値を表し、2 つ目はy
軸の値を表します。
legacy coordinate pairs を使用してクエリを有効にするには、 コレクションの フィールドに2d
インデックスを作成します。 次のスニペットは、 createIndex()
メソッドを使用して、 shipwrecks
コレクションのcoordinates
フィールドにインデックスを作成します。
db.shipwrecks({coordinates: "2d"});
詳細については、 legacy coordinate pairsに関する MongoDB Server のマニュアル ページ を参照してください。
注意
球面( 2dsphere
)と平面( 2d
)のインデックスは、同じクエリ演算子の一部をサポートしていますが、すべてではありません。 演算子とインデックスの互換性の完全なリストについては、 地理空間クエリ に関するマニュアル エントリを参照してください。
例
次の例では、MongoDB Atlas サンプル データセットを使用します。 独自の無料階層 Atlas クラスターを設定する方法と、サンプル データセットをロードする方法については、 クイック スタート ガイドを参照してください。
例では、サンプル データセットの sample_mflix
データベースの theaters
コレクションを使用します。theaters
コレクションには、 location.geo
フィールドに 2dsphere
インデックスが含まれています。
近接性によるクエリ
$near演算子は、経度緯度座標のセットを受け入れ、最も近いものから最も遠いものの順にドキュメントを返します。 結果をメートル単位で最大距離に制限するには、 $maxDistance
オプションを使用します。 オプションの完全なリストについては、 $near
の参考ドキュメントを参照してください。 次の例では、 [ -73.9667, 40.78 ]
から10,000
メートル以内にある映画館をクエリします。
// Find theaters within a certain proximity async function proximity(theaters) { // Define the query to find theaters near a specific location const query = { "location.geo": { $near: { $geometry: { type: "Point", coordinates: [-73.9667, 40.78] }, $maxDistance: 10000, }, }, }; // Find documents based on our query const cursor = theaters.find(query);
範囲内のクエリ
$geoWithin演算子は、指定された形状内に存在する地理空間データを含むドキュメントを選択します。 次の例では、ニューヨークの映画館を検索しています。
// Find theaters within a specific geographic range async function range(theaters) { // Define the query to find theaters within a specified polygon const query = { "location.geo": { $geoWithin: { $geometry: { type: "Polygon", coordinates: [ [ [-72, 40], // Polygon coordinates defining the range [-74, 41], [-72, 39], [-72, 40], ], ], }, }, }, }; // Find documents based on our query const cursor = theaters.find(query);
クエリで使用できる演算子の詳細については、地理空間クエリ演算子 に関する MongoDB Server のマニュアル ページ を参照してください。