Introduzione al Capitolo

Questo capitolo illustra le query geospaziali di MongoDB con Golang, inclusi come memorizzare informazioni sulla posizione e come eseguire query per distanza.

Tutorial Prerequisiti

Suggerimento: Se non si è familiari con la sintassi di query di MongoDB, si consiglia di leggere prima il tutorial su MongoDB. La sintassi di espressione utilizzata per operare MongoDB in Golang è la stessa.

Preparare i Dati di Test

Inserire alcuni dati contenenti coordinate geografiche nella collezione coll. Il campo location memorizza le coordinate di latitudine e longitudine dei negozi.

docs := []interface{}{
	bson.D{
		{"title", "Pollo al Vapore di Hainan"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.240015, 39.899617}}
		}},
	},
	bson.D{
		{"title", "Maiale alla Brace di Guangdong"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.268854, 39.900276}}
		}},
	},
	bson.D{
		{"title", "Oca Arrosto di Guangdong"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.264905, 39.902778}}
		}},
	},
	bson.D{
		{"title", "Frittella di Shanxi"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.288938, 39.893164}}
		}},
	},
	bson.D{
		{"title", "Ravioli di Hangzhou"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.286191, 39.910415}}
		}},
	}
}

risultato, err := coll.InsertMany(context.Background(), docs)

Query per Distanza

Utilizzare l'operatore $near per eseguire una query per distanza. Supponendo che la collezione coll memorizzi dati dei negozi, e che il campo location memorizzi le coordinate di ogni negozio, il codice seguente esegue la query per trovare il negozio più vicino a me (distanza minima 1000 metri, distanza massima 5000 metri).

cursor, err := coll.Find(
	context.Background(),
	bson.D{{"location", bson.D{
		{"$near": bson.D{
			{"$geometry": bson.D{{"type":"Point"}, {"coordinates": bson.A{116.288938,39.893164}}}, // Le mie coordinate attuali
			{"$minDistance": 1000}, // Distanza minima
			{"$maxDistance": 5000} // Distanza massima
		}}
	}}}
)

Espressione equivalente:

{
     location:
       { $near :
          {
            $geometry: { type: "Point",  coordinates: [ -73.9667, 40.78 ] }, // Le mie coordinate
            $minDistance: 1000, // Distanza minima
            $maxDistance: 5000 // Distanza massima
          }
       }
}

L'espressione è la stessa dell'espressione nativa di MongoDB, l'unico differenza è che viene ridescritta utilizzando la struttura dati di Golang.