定義
$nearSphereSpecifies a point for which a geospatial query returns the documents from nearest to farthest. MongoDB calculates distances for
$nearSphereusing spherical geometry.$nearSphereには地理空間インデックスが必要です。GeoJSON ポイントとして定義されたロケーション データの2dsphereインデックス
legacy coordinate pairs として定義されたロケーション データの2dインデックス GeoJSON ポイントで
2dインデックスを使用するには、GeoJSON オブジェクトのcoordinatesフィールドにインデックスを作成します。
The
$nearSphereoperator can specify either a GeoJSON point or legacy coordinate point.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はどちらのインデックスでも使用できます。
レガシー座標に経度と緯度を使用する場合は、最初に経度、次に緯度を指定します。
動作
特殊インデックスの制限
You cannot combine the $nearSphere operator, which requires a special geospatial index, with a query operator or command that requires another special index. For example you cannot combine $nearSphere with the $text query.
ソート操作
The $nearSphere operator sorts documents by distance.
クエリで
sort()メソッドを使用すると、MongoDB は 2 番目の並べ替え操作を実行して、一致するドキュメントの順序を変更します。大規模なコレクションをクエリする場合、これはクエリのパフォーマンスに悪影響を与える可能性があります。ドキュメントの順序が重要でない場合は、並べ替えられていない結果が返されるため、代わりに
$geoWithin演算子の使用を検討してください。$nearSphereはマッチ式演算子であり、集計パイプラインでは許可されていません。
検証
Starting in MongoDB 8.0, $near, $nearSphere, and $geoNear validate that the type of the specified GeoJSON points is Point. Any other input type returns an error.
メモリの使用
Starting in MongoDB 9.0, MongoDB tracks the memory that $nearSphere uses to buffer results and to remove duplicate records. If the query exceeds the 100 megabyte memory limit for the stage, MongoDB ends the query and returns an error.
多数のドキュメントに一致するクエリのみが上限に達します。クエリに必要なメモリを削減するには、検索範囲を制限するために maxDistance を指定します。このメモリは、操作ごとのメモリ制限に含まれます。さらに学ぶには、「操作ごとのメモリ制限」を参照してください。
例
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 } } )