$nearSphere
定義
$nearSphere
地理空間クエリの基準となる地点を指定します。この地点をもとに、指定した地点から最も近いドキュメントから最も遠いドキュメントの順に地理空間クエリによりドキュメントが返されます。 MongoDB は球面ジオメトリを使用して
$nearSphere
の距離を計算します。$nearSphere
には地理空間インデックスが必要です。GeoJSON ポイントとして定義されたロケーション データの2dsphereインデックス
legacy coordinate pairs として定義されたロケーション データの2dインデックス GeoJSON ポイントで
2d
インデックスを使用するには、GeoJSON オブジェクトのcoordinates
フィールドにインデックスを作成します。
$nearSphere
演算子は、 GeoJSONポイントまたはレガシー座標ポイントのいずれかを指定できます。GeoJSONポイントを指定するには、次の構文を使用します。
{ $nearSphere: { $geometry: { type : "Point", coordinates : [ <longitude>, <latitude> ] }, $minDistance: <distance in meters>, $maxDistance: <distance in meters> } } 任意の
$minDistance
を使用すると、中心点から指定された 以上 の距離にあるドキュメントに結果が制限されます。任意の
$maxDistance
はどちらのインデックスでも使用できます。
レガシー座標を使用して点を指定するには、次の構文を使用します。
{ $nearSphere: [ <x>, <y> ], $minDistance: <distance in radians>, $maxDistance: <distance in radians> } オプションの
$minDistance
は、クエリが2dsphereインデックスを使用する場合にのみ使用できます。$minDistance
では、中心点から指定された 以上 の距離にあるドキュメントに結果が制限されます。任意の
$maxDistance
はどちらのインデックスでも使用できます。
レガシー座標に経度と緯度を使用する場合は、最初に経度、次に緯度を指定します。
動作
特殊インデックスの制限
$nearSphere
特殊な 地理空間インデックス を必要とする 演算子と、別の特殊インデックスを必要とするクエリ演算子またはコマンドを組み合わせることはできません。たとえば、 $nearSphere
と$text
クエリを組み合わせることはできません。
ソート操作
$nearSphere
演算子は、ドキュメントを距離順にソートします。
クエリで
sort()
メソッドを使用すると、MongoDB は 2 番目の並べ替え操作を実行して、一致するドキュメントの順序を変更します。大規模なコレクションをクエリする場合、これはクエリのパフォーマンスに悪影響を与える可能性があります。ドキュメントの順序が重要でない場合は、並べ替えられていない結果が返されるため、代わりに
$geoWithin
演算子の使用を検討してください。$nearSphere
はマッチ式演算子であり、集計パイプラインでは許可されていません。
検証
MongoDB 8.0以降、 $near
、 $nearSphere
、 $geoNear
は、指定されたGeoJSON ポイントのタイプがPoint
であることを検証します。 その他の入力型はエラーを返します。
例
GeoJSON を使用した中心点の指定
location
フィールドと2dsphereインデックスを持つドキュメントを含むコレクションplaces
について考えます。
次に、次の例では、指定された点から少なくとも1000
メートル、最大5000
メートル離れたlocation
を、最も近いものから最も遠いものの順に返します。
db.places.find( { location: { $nearSphere: { $geometry: { type : "Point", coordinates : [ -73.9667, 40.78 ] }, $minDistance: 1000, $maxDistance: 5000 } } } )
レガシー座標を使用した中心点の指定
2d
Index
location
フィールドに legacy coordinates pairs を持つドキュメントを含み、 2dインデックスを持つコレクションlegacyPlaces
について考えてみましょう。
次に、次の例では、 location
が指定された点から最大0.10
ラジアンであるドキュメントを、最も近いものから最も遠いものの順に返します。
db.legacyPlaces.find( { location : { $nearSphere : [ -73.9667, 40.78 ], $maxDistance: 0.10 } } )
2dsphere
Index
代わりに、コレクションに2dsphere
インデックスがある場合は、オプションの$minDistance
仕様を指定することもできます。 たとえば、次の例では、 location
が指定された点から少なくとも0.0004
ラジアンであるドキュメントを、最も近いものから最も遠いものの順に返します。
db.legacyPlaces.find( { location : { $nearSphere : [ -73.9667, 40.78 ], $minDistance: 0.0004 } } )