Não entendi como o índice funciona?, como ele pega a localização dos registros e compara com a que foi passada no aggregate, é automático?
Não entendi como o índice funciona?, como ele pega a localização dos registros e compara com a que foi passada no aggregate, é automático?
Olá Diego, tudo bem?
Estou começando na Alura e respondendo algumas dúvidas mais antigas, peço perdão pela demora!
Vamos por partes, para deixar um pouco mais claro:
db.alunos.createIndex({
"localizacao": "2dsphere"
})
O que o mongo faz é separar uma estrutura de dados auxiliar para guardar a localização de todos usuários de nosso banco de dados, então no caso estamos dizendo que é para em nossa coleção alunos pegar o campo localização e utilizar o tipo 2dsphereApós isso vamos para a nossa consulta:
$geoNear: {
"near": {
"coordinates": [-23.5640265, -46.6527128],
"type": "Point"
},
distanceField: "distancia.calculada",
spherical: true,
}
Então utilizamos o operador de comparação de distância ($geoNear), que nos obrigou a criar um índice com o tipo de distância geoespacial, para que ele saiba onde ele tem que fazer a busca, e após isso utilizamos o "near" que é para dizer perto de qual coordenada, pedimos para que ele armazene em um campo chamado "distancia.calculada" e que é para ele utilizar o cálculo de distância 2D (esférico).
Talvez o que ficou confuso para você, foi como ele sabia como ir no índice correto, né? A questão é que só temos um índice no formato de distância geoespacial, então automaticamente ele já foi no correto, caso tivéssemos mais de 1 teríamos que ter especificado com um atributo especial chamado key, seria algo como:
$geoNear: {
"near": {
"coordinates": [-23.5640265, -46.6527128],
"type": "Point"
},
key: "localizacao"
distanceField: "distancia.calculada",
spherical: true,
}
Dessa forma estaríamos dizendo que de todos os nossos índices espaciais era para utilizar o "localização"
O resto o mongo faz automaticamente, ele compara a posição que passamos no $near, e vai calculando a distância com cada elemento do índice e organizando de acordo com os mais próximos :)
Abraços e Bons Estudos!