MongoDBの地理空間クエリとインデックスの活用方法

この記事では、MongoDBの地理空間クエリ機能とその関連するインデックスの使用例について詳しく解説します。地理空間データを扱う際の基本的なクエリから、より高度な検索に使える2dsphereインデックスまで、具体的なコード例とともに説明していきます。
目次

地理空間データの基本

MongoDBでは、地理空間データを格納・検索するための特別な型とインデックスが用意されています。主に以下の2種類の地理空間インデックスがあります。
  • 2dインデックス
  • 2dsphereインデックス
  • 2dインデックスとは

    2dインデックスは、平面上の点を格納するためのインデックスです。これは主に緯度と経度のような平面座標を使用します。 db.collection.createIndex({location: “2d”})

    2dsphereインデックスとは

    2dsphereインデックスは、地球上の点、線、ポリゴンを格納できるインデックスです。WGS84座標系を用いて地球上の形状を近似します。 db.collection.createIndex({location: “2dsphere”})

    基本的な地理空間クエリ

    近くの場所を検索する

    基本的な地理空間クエリとして、ある地点から一定の距離以内にある場所を検索する例です。
    クエリ 説明
    $near 指定された地点から近い順にドキュメントを返す
    $maxDistance 指定された最大距離以内のドキュメントをフィルターする
    基本的な地理空間クエリ

    クエリ例

    以下は、東京タワーから半径500メートル以内のレストランを検索するクエリです。
    db.restaurants.find({
      location: {
        $near: {
          $geometry: { type: "Point", coordinates: [139.7454, 35.6586] },
          $maxDistance: 500
        }
      }
    })
    

    高度な地理空間クエリ

    領域内のオブジェクトを検索

    ある領域(ポリゴン)内に存在するオブジェクトを検索するには、$geoWithinオペレータを使用します。
    クエリ 説明
    $geoWithin 指定された領域内のオブジェクトを検索
    $geometry 地理空間オブジェクトの形状を指定
    高度な地理空間クエリ

    クエリ例

    以下は、渋谷区内に存在する観光スポットを検索する例です。
    db.spots.find({
      location: {
        $geoWithin: {
          $geometry: {
            type: "Polygon",
            coordinates: [
              [[139.6981, 35.6895], [139.7000, 35.6895], [139.7000, 35.6910], [139.6981, 35.6910], [139.6981, 35.6895]]
            ]
          }
        }
      }
    })
    

    まとめ

    MongoDBの地理空間クエリとインデックスは非常に強力なツールです。2dインデックスと2dsphereインデックスを活用することで、地理空間データに対する柔軟かつ高速な検索が可能です。具体的なクエリ例を通じて、基本的な検索から高度な検索まで幅広くカバーしました。これらの機能を活用して、地理空間データの扱いをより効率的に行いましょう。