Utilizzare la ricerca geospaziale

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, dal più vicino al più lontano, 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 includendola 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.