Introdução do Capítulo

Este capítulo apresenta consultas geoespaciais MongoDB em Golang, incluindo como armazenar informações de localização e fazer consultas por distância.

Tutoriais Pré-requisitos

Dica: Se você não está familiarizado com a sintaxe de consulta do MongoDB, leia primeiro o tutorial do MongoDB. A sintaxe de expressão usada para operar o MongoDB em Golang é a mesma.

Preparar Dados de Teste

Escreva alguns dados contendo coordenadas geográficas na coleção coll. O campo location armazena as coordenadas de latitude e longitude das lojas.

docs := []interface{}{
	bson.D{
		{"title", "Frango Cozido de Hainan"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116,240015, 39,899617}}
		}},
	},
	bson.D{
		{"title", "Porco Assado de Guangdong"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116,268854, 39,900276}}
		}},
	},
	bson.D{
		{"title", "Ganso Assado de Guangdong"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116,264905, 39,902778}}
		}},
	},
	bson.D{
		{"title", "Panqueca de Shanxi"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116,288938, 39,893164}}
		}},
	},
	bson.D{
		{"title", "Dumplings de Hangzhou"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116,286191, 39,910415}}
		}},
	}
}

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

Consultar por Distância

Use o operador $near para implementar uma consulta por distância. Supondo que a coleção coll armazene dados da loja, e o campo location armazene as coordenadas de cada loja, o código a seguir consulta a loja mais próxima de mim (distância mínima de 1000 metros, distância máxima de 5000 metros).

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}}}, // Minhas coordenadas atuais
			{"$minDistance": 1000}, // Distância mínima
			{"$maxDistance": 5000} // Distância máxima
		}}
	}}}
)

Expressão equivalente:

{
     location:
       { $near :
          {
            $geometry: { type: "Point",  coordinates: [ -73.9667, 40.78 ] }, // Minhas coordenadas
            $minDistance: 1000, // Distância mínima
            $maxDistance: 5000 // Distância máxima
          }
       }
}

A expressão é a mesma que a expressão nativa do MongoDB, a única diferença é redescrevê-la usando a estrutura de dados do Golang.