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.