Introducción del Capítulo

Este capítulo presenta las consultas geoespaciales de Golang MongoDB, incluyendo cómo almacenar información de ubicación y realizar consultas por distancia.

Tutoriales Previos

Consejo: Si no estás familiarizado con la sintaxis de consulta de MongoDB, por favor lee primero el tutorial de MongoDB. La sintaxis de expresión utilizada para operar MongoDB en Golang es la misma.

Preparar Datos de Prueba

Escribe algunos datos que contengan coordenadas geográficas en la colección coll. El campo location almacena las coordenadas de latitud y longitud de las tiendas.

docs := []interface{}{
	bson.D{
		{"title", "Pollo al Vapor de Hainan"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.240015, 39.899617}}
		}},
	},
	bson.D{
		{"title", "Cerdo Barbacoa de Guangdong"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.268854, 39.900276}}
		}},
	},
	bson.D{
		{"title", "Ganso Asado de Guangdong"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.264905, 39.902778}}
		}},
	},
	bson.D{
		{"title", "Panqueque de Shanxi"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.288938, 39.893164}}
		}},
	},
	bson.D{
		{"title", "Empanadas de Hangzhou"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.286191, 39.910415}}
		}},
	}
}

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

Consultar por Distancia

Utiliza el operador $near para implementar una consulta por distancia. Suponiendo que la colección coll almacena datos de tiendas, y el campo location almacena las coordenadas de cada tienda, el siguiente código realiza la consulta de la tienda más cercana a mí (distancia mínima 1000 metros, distancia máxima 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}}}, // Mis coordenadas actuales
			{"$minDistance": 1000}, // Distancia mínima
			{"$maxDistance": 5000} // Distancia máxima
		}}
	}}}
)

Expresión equivalente:

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

La expresión es la misma que la expresión nativa de MongoDB, la única diferencia es volver a describirla usando la estructura de datos de Golang.