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