Utilizzare le query geospaziali

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

Prima di iniziare

  1. Assicurati di avere accesso a un database di operazioni compatibili con MongoDB esistente o crea un database e connettiti.

  2. Assicurati di avere almeno un indice 2dsphere o crea un indice 2dsphere.

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 dalla distanza più vicina a quella più lontana nei risultati della query. Puoi anche sostituire 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 location campo di tutti i documenti in myCollection. I documenti vengono restituiti e ordinati in base alla distanza più vicina a quella 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 ad almeno 500 metri e al massimo 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 procedere nel seguente modo:

  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 della 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 a 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.