この章では、MongoDBの地理空間クエリを紹介します。これにより、幾何学的な交差や含まれるクエリがサポートされます。

アプリケーションシナリオ:

  • 地図上に円を描き、その円内のデータをクエリします。

前提チュートリアル

MongoDBの地理空間データストレージフォーマット

距離に基づくデータのクエリの前提条件は以下のとおりです:

  • 各ドキュメントデータには、座標データを格納するフィールドが含まれている必要があります。例: locationフィールドは店舗の座標を格納します。
  • 2dsphereまたは2d空間インデックスを作成します。

$geoWithin演算子

これは、指定した幾何学的範囲内に含まれる座標点をクエリするために一般的に使用されます。例: 地図上で家を検索するときに、地図上に領域を描いてその領域内の家をクエリするとします。

構文形式:

{
   <location field>: { // クエリフィールド
      $geoWithin: {
         $geometry: {
            type:  , // PolygonまたはMultiPolygonのみをサポートします。
            coordinates: [ <coordinates> ]  // 幾何学的座標点のコレクション
         }
      }
   }
}

例:

db.places.find(
   {
     loc: { // locフィールドは座標データを格納します
       $geoWithin: {
          $geometry: {
             type: "Polygon" ,
             coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ] // この幾何学的領域内のデータを検索
          }
       }
     }
   }
)

placesコレクション内の指定した幾何学的領域内のドキュメントデータをクエリします。

$geoIntersects演算子

$geoWithinとの違いは、$geoIntersectsが2つの幾何学的形状の間に交差があるかどうかを判定するために使用されることです。

形式:

{
  <location field>: { // 幾何学的座標点を格納するフィールド
     $geoIntersects: {
        $geometry: {
           type: "<geojson object type>" , // 幾何学的タイプ
           coordinates: [ <coordinates> ] // 幾何学的座標点のコレクション。この幾何学的形状と交差するデータをクエリします
        }
     }
  }
}

例:

db.places.find(
   {
     loc: { // locフィールドは領域データを格納し、幾何学的な形状です
       $geoIntersects: {
          $geometry: {
             type: "Polygon" ,
             coordinates: [
               [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] // この幾何学的形状と交差するデータをクエリします
             ]
          }
       }
     }
   }
)