地理空間クエリを使用する

MongoDB 互換のオペレーションで地理空間クエリを使用して、特定の経度と緯度から一定の範囲内にあるドキュメントをクエリします。

始める前に

  1. 既存の MongoDB 互換オペレーション データベースにアクセスできることを確認するか、データベースを作成して接続します。

  2. 少なくとも 1 つの 2dsphere インデックスがあることを確認するか、2dsphere インデックスを作成します。

GeoJSON オブジェクト

コレクション内のフィールドに対して地理空間クエリを実行するには、クエリするフィールドが GeoJSON オブジェクトまたは GeoPoint である必要があります。

$near 演算子を使用して地理空間クエリを実行できます。この演算子は、ドキュメント内の地理空間ポイントに対する地理空間ポイントの距離を計算します。これらのドキュメントは、クエリ結果で距離が近い順に並べ替えられます。クエリで $natural 以外のセカンダリ ソートを定義して、この並べ替え順序をオーバーライドすることもできます。$near 演算子は、クエリ フィルタのドキュメント フィールドに存在し、$geometry GeoJSON フィールドを含む必要があります。

次の例では、$near 演算子を使用して、myCollection. 内のすべてのドキュメントの location フィールドにある地理的位置と地理的位置 (-122.084, 37.4221) の間の距離を計算します。ドキュメントは、2 点間の距離が近い順に返されます。

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        }
      }
    }
  }
  )

オプションの $maxDistance フィールドと $minDistance フィールドを使用して、クエリのポイントからの距離(メートル単位)を制御することもできます。次の例は、返されるドキュメントがポイント (-122.084, 37.4221) から 500 メートル以上 2,000 メートル以下である必要があるクエリを示しています。

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
        $maxDistance: 2000,
        $minDistance: 500
      }
    }
  }

インデックスがパーティション分割されている場合は、クエリ内の「and」等値フィルタにパーティションを含めることで、パーティションに基づいてフィルタできます。たとえば、region パーティションがあり、クエリ結果を midwest リージョンでフィルタリングする場合は、次の操作を行います。

  db.myCollection.find( { $and: [
    { location:
      { $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
      }
    },
    { "region": "midwest" }
  ] } )

パーティションの値は文字列にする必要があります。パーティション フィルタは、$and 演算子で検索クエリに結合する必要があります。

制限事項

  • $near 演算子と $text 演算子は、同じクエリで使用できません。
  • $near$or 句内の唯一の式でない限り、$near を複数句の $or ステートメントにネストすることはできません。
  • $near は、クエリで $not 演算子または $nor 演算子と併用できません。
  • $near は集約クエリでサポートされていません。