在 MongoDB 相容作業中使用地理空間查詢,查詢特定經緯度一定範圍內的現有文件。
事前準備
確認您有權存取現有的 MongoDB 相容作業資料庫,或建立資料庫並連線。
確認您至少有一個 2dsphere 索引,或建立 2dsphere 索引。
GeoJSON 物件
如要對集合中的欄位執行地理空間查詢,查詢的欄位必須是 GeoJSON 物件或 GeoPoint。
執行地理空間查詢
您可以使用 $near 運算子執行地理空間查詢,計算地理點相對於文件中地理點的距離。接著,系統會根據距離排序查詢結果中的文件,由近到遠。您也可以在查詢中定義次要排序 ($natural 除外),藉此覆寫排序順序。查詢篩選條件的文件欄位中必須有 $near 運算子,且必須包含 $geometry GeoJSON 欄位。
在下列範例中,$near 運算子用於計算地理點 (-122.084, 37.4221) 與 myCollection. 中所有文件的 location 欄位中地理點之間的距離。系統會傳回文件,並依兩點間的距離排序,由近到遠。
db.myCollection.find({
location: {
$near: {
$geometry: {
type: 'Point',
coordinates: [ -122.084, 37.4221 ]
}
}
}
}
)
您也可以使用選用的 $maxDistance 和 $minDistance 欄位,控管與查詢點的距離 (以公尺為單位)。以下範例顯示的查詢會傳回與 (-122.084, 37.4221) 點距離至少 500 公尺,且最多 2000 公尺的文件:
db.myCollection.find({
location: {
$near: {
$geometry: {
type: 'Point',
coordinates: [ -122.084, 37.4221 ]
},
$maxDistance: 2000,
$minDistance: 500
}
}
}
如果索引已分區,您可以在查詢中加入「and」等值篩選器,根據分區進行篩選。舉例來說,如果您有 region 分區,並想依 midwest 區域篩選查詢結果,可以執行下列操作:
db.myCollection.find( { $and: [
{ location:
{ $near: {
$geometry: {
type: 'Point',
coordinates: [ -122.084, 37.4221 ]
},
}
},
{ "region": "midwest" }
] } )
分割區的值必須是字串。您的分割區篩選器必須透過 $and 運算子加入搜尋查詢。
限制
$near運算子和$text運算子無法在同一項查詢中使用。$near無法巢狀內嵌在多子句$or陳述式中,除非$near是$or子句中的唯一運算式。- 查詢時無法搭配使用
$near和$not或$nor運算子。 $near不支援匯總查詢。