使用地理空間搜尋功能

在 MongoDB 相容作業中使用地理空間查詢,查詢特定經緯度一定範圍內的現有文件。

事前準備

  1. 確認您有權存取現有的 MongoDB 相容作業資料庫,或建立資料庫並連線

  2. 確認您至少有一個 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 不支援匯總查詢。