Utilizzare le query geospaziali

Utilizza le query geospaziali nelle operazioni compatibili con MongoDB per eseguire query sui documenti che si trovano in un determinato intervallo da una longitudine e una latitudine specifiche.

Prima di iniziare

  1. Assicurati di avere accesso a un database operativo compatibile con MongoDB esistente oppure crea un database e connettiti a esso.

  2. Assicurati di avere almeno un indice 2dsphere o creane uno.

Oggetti GeoJSON

Per eseguire una query geospaziale sui campi della raccolta, i campi su cui esegui la query devono essere oggetti GeoJSON o GeoPoint.

Puoi eseguire una query geospaziale utilizzando l'operatore $near, che calcola la distanza di un punto geografico rispetto ai punti geografici all'interno dei documenti. Questi documenti vengono poi ordinati in base alla distanza più vicina e più lontana nei risultati della query. Puoi anche ignorare questo ordinamento definendo un ordinamento secondario diverso da $natural nella query. L'operatore $near deve esistere in un campo del documento nel filtro della query e deve contenere un campo GeoJSON $geometry.

Nell'esempio seguente, l'operatore $near viene utilizzato per calcolare la distanza tra il punto geografico (-122.084, 37.4221) e i punti geografici che si trovano nel campo location di tutti i documenti in myCollection.. I documenti vengono restituiti e ordinati in base alla distanza più vicina e più lontana tra i due punti.

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

Puoi anche utilizzare i campi facoltativi $maxDistance e $minDistance per controllare la distanza in metri dal punto della query. L'esempio seguente mostra una query in cui i documenti restituiti devono trovarsi a una distanza compresa tra 500 e 2000 metri dal punto (-122.084, 37.4221):

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

Se l'indice è partizionato, puoi filtrare in base alla partizione includendo la partizione in un filtro di uguaglianza "and" all'interno della query. Ad esempio, se avevi una partizione region e volevi filtrare i risultati della query in base alla regione midwest, potevi fare quanto segue:

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

Il valore della partizione deve essere una stringa. Il filtro di partizione deve essere unito alla query di ricerca da un operatore $and.

Limitazioni

  • Gli operatori $near e $text non possono essere utilizzati nella stessa query.
  • $near non può essere nidificato in un'istruzione $or con più clausole, a meno che $near non sia l'unica espressione nella clausola $or.
  • $near non può essere utilizzato con gli operatori $not o $nor in una query.
  • $near non è supportato nelle query di aggregazione.