地理空間検索を使用する

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

始める前に

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

  2. 2dsphere インデックスが 1 つ以上あることを確認するか、 2dsphere インデックスを作成します

GeoJSON オブジェクト

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

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

次の例では、$near 演算子を使用して、地理ポイント (-122.084, 37.4221)myCollection. 内のすべてのドキュメントの location フィールドにある地理ポイントとの距離を計算します。ドキュメントが返され、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 は、集約クエリではサポートされていません。