Docs Menu
Docs Home
/ / /
Node.js ドライバー
/ / /

地理空間で検索する

項目一覧

  • Overview
  • 地球のような球体上の座標
  • 2D 平面上の座標
  • 近接性によるクエリ
  • 範囲内のクエリ

地理空間クエリ演算子 を使用して、地理的場所に基づいてデータをクエリできます。 次のいずれかの座標システムを使用して、地理空間クエリの形式を設定できます。

  • 地球のような球体上の座標

  • 2D 平面上の座標

このセクションでは、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"});

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 のマニュアル ページ を参照してください。

戻る

返すフィールドを指定する