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