Docs Menu
Docs Home
/ /

地理空間クエリ

MongoDB は地理空間データに対するクエリ操作をサポートしています。このセクションでは、MongoDB の地理空間機能を紹介します。

MongoDB では、地理空間データを GeoJSON オブジェクトまたは legacy coordinate pairs として保存できます。

地球のような球体上の形状を計算するには、ロケーションデータを GeoJSON オブジェクトとして保存します。

GeoJSON データを指定するには、以下の埋め込みドキュメントを使用します。

  • GeoJSON オブジェクトタイプを指定する typeという名前のフィールドと

  • オブジェクトの座標を指定する coordinates というフィールド。

<field>: { type: <GeoJSON type> , coordinates: <coordinates> }

重要

緯度と経度の座標を指定する場合は、最初に経度、次に緯度を指定します。

  • 有効な経度の値は、-180 以上、180 以下です。

  • 有効な緯度の値は-90 以上、90 以下です。

たとえば、GeoJSONポイントを指定するには、次のようにします。

location: {
type: "Point",
coordinates: [-73.856077, 40.848447]
}

MongoDBでサポートされている GeoJSON オブジェクトのリストと例については、「GeoJSON オブジェクト」を参照してください。

GeoJSON オブジェクトに対する MongoDB の地理空間クエリは球体上で計算されます。MongoDB は、GeoJSON オブジェクトに対する地理空間クエリに WGS84 参照システムを使用します。

2d インデックスインデックスを使用して平面(ユークリッド)計算にレガシー coordinate pairs を使用します。球面計算を実行するには、レガシーペアを GeoJSONPoint に変換し、2 dsphere インデックスインデックスを使用します。

データを legacy coordinate pairs として指定するには、配列(推奨)または埋め込みドキュメントのいずれかを使用できます。

配列:
<field>: [ <x>, <y> ]

経度と緯度を使用する場合は、最初に経度、次に緯度を指定します。

<field>: [ <longitude>, <latitude> ]
  • 有効な経度の値は、-180 以上、180 以下です。

  • 有効な緯度の値は-90 以上、90 以下です。

埋め込みドキュメント:
<field>: { <field1>: <x>, <field2>: <y> }

経度と緯度を使用する場合、最初のフィールドは 経度 、2 番目のフィールドは 緯度 である必要があります。

<field>: { <field1>: <longitude>, <field2>: <latitude> }
  • 有効な経度の値は、-180 以上、180 以下です。

  • 有効な緯度の値は-90 以上、90 以下です。

一部の言語ではオブジェクトフィールドの順序が保持されないため、 レガシー coordinate pairs には配列を使用します。

地理空間インデックスは、 GeoJSON オブジェクトまたはレガシー coordinate pairs として保存されたデータに対するクエリをサポートします。地理空間インデックスを使用すると、地理空間データに対するクエリのパフォーマンスを向上させたり、特定の地理空間クエリを実行したりできます。

MongoDB は 2 種類の地理空間インデックスを提供します。

地理空間インデックスの詳細については、「地理空間インデックス」を参照してください。

注意

球状データのクエリに 2d インデックスを使用すると、誤った結果やエラーが返されることがあります。たとえば、2d インデックスでは、北極と南極が入っている球面クエリはサポートされていません。

MongoDB には以下のような地理空間クエリ演算子があります。例を含む詳細については、各リファレンスページを参照してください。

名前
説明

GeoJSON ジオメトリと交差するジオメトリを選択します。2dsphere インデックスは $geoIntersects をサポートします。

境界となる GeoJSON ジオメトリ内のジオメトリを選択します。2dsphere2d インデックスは $geoWithin をサポートします。

点に近接する地理空間オブジェクトを返します。地理空間インデックスが必要です。2dsphere および2d インデックスは $near をサポートします。

球上の点に近接する地理空間オブジェクトを返します。地理空間インデックスが必要です。2dsphere および2d インデックスは $nearSphere をサポートします。

注意

時系列コレクションは、2dsphere インデックスに対するクエリからの地理空間データをソートするための $geoNear 集計ステージのみをサポートしています。時系列コレクションでは $near および $nearSphere 演算子は使用できません。

MongoDB には、次の地理空間集約パイプライン ステージがあります。

ステージ
説明

地理空間点への近接性に基づいて、順序が付けられたドキュメントのストリームを返します。地理空間データ用の $match$sort$limit 機能を組み込みます。出力ドキュメントには、追加の距離フィールドが含まれ、ロケーション識別子フィールドを含めることができます。

$geoNearには地理空間インデックスが必要です。

例を含む詳細については、$geoNear リファレンス ページを参照してください。

MongoDB 地理空間クエリは、平面または球面上のジオメトリを解釈できます。

2dsphere インデックスは球面クエリ(球面上のジオメトリを解釈するクエリ)のみをサポートします。

2d インデックスは平面クエリ(平面上のジオメトリを解釈するクエリ)や、一部の球面クエリをサポートします。2d インデックスは一部の球面クエリをサポートしていますが、これらの球面クエリに 2d インデックスを使用するとエラーが発生する可能性があります。可能であれば、球面クエリには 2dsphere インデックスを使用してください。

次の表は、各地理空間操作で使用される地理空間クエリ演算子とサポートされているクエリを一覧表示したものです。

操作
球面/平面クエリ
ノート

$near(この行と次の行の GeoJSON 中心点、2 dsphereインデックス)

球面

$near(レガシー座標 2 dインデックス)

平面

$nearSphere GeoJSONポイント、 2dsphereインデックス)

球面

GeoJSONポイントと$near 2dsphereインデックス を使用する 操作と同じ機能を提供します。

球面クエリの場合、$nearSphere 演算子ではなく、名前で球面クエリを明示的に指定する $near を使用する方が適している場合があります。

$nearSphere(レガシー座標 2 dインデックス)

球面

代わりに GeoJSONポイントを使用してください。

球面

$geoWithin : { $box: ... }

平面

$geoWithin : { $polygon: ... }

平面

$geoWithin : { $center: ... }

平面

球面

球面

$geoNear集計ステージ(2 dsphereインデックス)

球面

$geoNear集計ステージ(2 dインデックス)

平面

Atlas で地理空間クエリを実行するには、 MongoDB Atlas UI を使用します。

1

地理空間コレクションに地理空間インデックスがない場合、作成する必要があります。

  1. コレクションのデータベースを選択します。

    メイン パネルと左側の Namespacesには、データベース内のコレクションが一覧表示されます。

  2. コレクションを選択します。

    左のパネルまたはメイン パネルで、地理空間データを含むコレクションを選択します。メイン パネルには、 FindIndexesAggregation のビューが表示されます。

  3. インデックス ビューを選択します。

    Index ビューを開くと、Atlas ではコレクションにあるすべてのインデックスが表示されます。

  4. 地理タイプのインデックスの定義

    Create Index ボタンを押してください。

    geo Typeインデックスを定義します。 「 GeoJSON オブジェクトのインデックスを作成する方法 」を参照してください。

2
  1. 検索ビューを選択します。

    地理空間データを含むコレクションから Find タブをクリックして地理空間コレクションを表示します。

  2. クエリを入力します。

    Filter テキストボックスにクエリを入力します。いずれかの地理空間クエリ演算子を使用して、地理空間データに対して関連するクエリを実行します。地理空間クエリは、次のようになります。

    {
    "coordinates": {
    $geoWithin: {
    $geometry: {
    type: "Polygon",
    coordinates: [
    [
    [-80.0, 10.00], [ -80.0, 9.00], [ -79.0, 9.0], [ -79.0, 10.00 ], [ -80.0, 10.0 ]
    ]
    ]
    }
    }
    }
    }
  3. 適用ボタンを押します。

    Apply ボタンを押してクエリを適用します。Atlas は地理空間データをフィルタリングして、地理空間クエリに一致するドキュメントのみを表示します。

MongoDB Atlas UI で地理空間クエリを実行するには、集計パイプラインを作成して実行します。

1
  1. コレクションのデータベースを選択します。

    メイン パネルと左側の Namespaces には、データベース内のコレクションが一覧表示されます。

  2. コレクションを選択します。

    左のパネルまたはメイン パネルで、地理空間データを含むコレクションを選択します。メイン パネルには、 FindIndexesAggregation のビューが表示されます。

  3. 集計ビューを選択します。

    Aggregation ビューを初めて開くと、Atlas では空の集計パイプラインが表示されます。

2
  1. 集計ステージを選択します。

    左下のパネルの Select ドロップダウンから集計ステージを選択します。

    ドロップダウンの右側にあるトグルで、ステージが有効かどうかを指定します。

    $geoNear ステージを使用して、集計パイプラインで地理空間クエリを実行します。

  2. 集計ステージを入力してください。

    ステージに適切な値を入力します。 コメントモードが有効になっている場合、パイプラインビルダは選択したステージの構文ガイドラインを提供します。

    ステージを変更すると、Atlasは現在のステージの結果に基づいて右側のプレビュー ドキュメントが更新されます。

    $geoNear ステージは次のようになります。

    {
    near: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
    spherical: true,
    query: { category: "Parks" },
    distanceField: "calcDistance"
    }
  3. 必要に応じて、他のパイプライン ステージを実行します。

    必要に応じてステージを追加して、集約パイプラインを完了します。$out または $merge を追加して、ビューまたは現在のコレクションに結果を書込み (write) できます。

次のドキュメントを使用してコレクション places を作成します。

db.places.insertMany( [
{
name: "Central Park",
location: { type: "Point", coordinates: [ -73.97, 40.77 ] },
category: "Parks"
},
{
name: "Sara D. Roosevelt Park",
location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] },
category: "Parks"
},
{
name: "Polo Grounds",
location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] },
category: "Stadiums"
}
] )

以下の操作は、location フィールドに2dsphere インデックスを作成します。

db.places.createIndex( { location: "2dsphere" } )

上の places コレクションには 2dsphere インデックスがあります。以下のクエリは、$near 演算子を使用し、指定された GeoJSONポイントから 1000 ~ 5000 メートル離れたドキュメントを、最も近いものから最も遠いものの順に並べ替えて返します。

db.places.find(
{
location:
{ $near:
{
$geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
$minDistance: 1000,
$maxDistance: 5000
}
}
}
)

以下の操作では、$geoNear 集計操作を使用して、クエリフィルター { category: "Parks" } に一致するドキュメントを、指定された GeoJSONポイントに最も近いものから最も遠いものの順に並べ替えて返します。

db.places.aggregate( [
{
$geoNear: {
near: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
spherical: true,
query: { category: "Parks" },
distanceField: "calcDistance"
}
}
] )

戻る

テキストインデックスのバージョン

項目一覧