Menggunakan penelusuran geospasial

Gunakan kueri geospasial dalam operasi yang kompatibel dengan MongoDB untuk membuat kueri dokumen yang ada dalam rentang tertentu dari bujur dan lintang tertentu.

Sebelum memulai

  1. Pastikan Anda memiliki akses ke database operasi yang kompatibel dengan MongoDB yang ada, atau Buat database dan hubungkan ke database tersebut.

  2. Pastikan Anda memiliki setidaknya satu indeks 2dsphere, atau Buat indeks 2dsphere.

Objek GeoJSON

Untuk menjalankan kueri geospasial terhadap kolom dalam koleksi Anda, kolom yang Anda kueri harus berupa objek GeoJSON atau GeoPoint.

Anda dapat melakukan kueri geospasial menggunakan operator $near, yang menghitung jarak titik geografis relatif terhadap titik geografis dalam dokumen. Dokumen ini kemudian diurutkan dari jarak terdekat hingga terjauh dalam hasil kueri. Anda juga dapat mengganti urutan pengurutan ini dengan menentukan pengurutan sekunder, selain $natural, dalam kueri Anda. Operator $near harus ada di kolom dokumen dalam filter kueri, dan harus berisi kolom GeoJSON $geometry.

Dalam contoh berikut, operator $near digunakan untuk menghitung jarak antara titik geo (-122.084, 37.4221) dan titik geo yang berada di kolom location dari semua dokumen di myCollection. Dokumen ditampilkan dan diurutkan berdasarkan jarak terdekat hingga terjauh antara kedua titik.

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        }
      }
    }
  }
  )

Anda juga dapat menggunakan kolom $maxDistance dan $minDistance opsional untuk mengontrol jarak dalam meter dari titik kueri Anda. Contoh berikut menunjukkan kueri yang dokumen yang ditampilkan harus berjarak minimal 500 meter dan maksimal 2.000 meter dari titik (-122.084, 37.4221):

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
        $maxDistance: 2000,
        $minDistance: 500
      }
    }
  }

Jika indeks Anda dipartisi, Anda dapat memfilter berdasarkan partisi dengan menyertakan partisi dalam filter kesetaraan "dan" dalam kueri Anda. Misalnya, jika Anda memiliki partisi region dan ingin memfilter hasil kueri menurut wilayah midwest, Anda dapat melakukan hal berikut:

  db.myCollection.find( { $and: [
    { location:
      { $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
      }
    },
    { "region": "midwest" }
  ] } )

Nilai partisi Anda harus berupa string. Filter partisi Anda harus digabungkan ke kueri penelusuran Anda dengan operator $and.

Keterbatasan

  • Operator $near dan operator $text tidak dapat digunakan dalam kueri yang sama.
  • $near tidak dapat disarangkan dalam pernyataan $or multi-klausa kecuali jika $near adalah satu-satunya ekspresi dalam klausa $or.
  • $near tidak dapat digunakan dengan operator $not atau $nor dalam kueri.
  • $near tidak didukung dalam kueri agregasi.