定義
$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 } } )