Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Problema no MongoDB "NearSphere" não recupera as informações - índice

Por favor,

preciso de alguma ajuda, pois estou com um problema na aula "Buscando aeroportos próximos de um ponto geográfico".

Se eu substituo a linha que recebe a "condicao"

var listaAeroportos = await conexaoAeroporto.Airports.Find(condicao).ToListAsync();

por "new BsonDocument()" funciona corretamente trazendo TODOS os aeroportos.

var listaAeroportos = await conexaoAeroporto.Airports.Find(new BsonDocument()).ToListAsync();

Mas quando eu uso o que foi colocado na aula, aparece o seguinte erro:

==========================================================

Pressione Enter

Command find failed: error processing query: ns=geo.airportsTree: GEONEAR field=loc maxdist=100000 isNearSphere=0

Falha ao encontrar o comando: erro ao processar consulta: ns=geo.airportsTree: GEONEAR field=loc maxdist=100000 isNearSphere=0

Sort: {}

Ordenar: {}

Proj: {}

Projeto: {}

planner returned error :: caused by :: unable to find index for $geoNear query.

planner retornou erro :: causado por :: não foi possível encontrar o índice para a consulta $ geoNear.

==========================================================

Mas quando eu substituo a linha:

var condicao = construtor.NearSphere(x => x.loc, localizacao, 100000);

pela linha:

BsonDocument condicao = construtor.NearSphere(x => x.loc, localizacao, 100000).ToBsonDocument();

NÃO aparece o erro, mas também NÃO recupera nenhuma informação.

Estou usando a versão 2.17.1 do MongoDB.Driver e a versão 6.0.1 do MongoDB.

Segue meu código:

static void Main(string[] args)
{
    Task T = MainAsync(args);
    Console.WriteLine();
    Console.WriteLine("Pressione Enter");
    Console.ReadLine();
}
static async Task MainAsync(string[] args)
{
    try
    {
        // Conexão
        var conexaoAeroporto = new conectandoMongoDBGeo();
        // Ponto Espacial - primeiro Longitude e depois latitude... fora de padrão.
        var ponto = new GeoJson2DGeographicCoordinates(-118.325258, 34.103212);
        // Ponto GeoJSON definido a partir do Ponto Espacial
        var localizacao = new GeoJsonPoint<GeoJson2DGeographicCoordinates>(ponto);

        var construtor = Builders<Aeroporto>.Filter;

        //BsonDocument condicao = construtor.NearSphere(x => x.loc, localizacao, 100000).ToBsonDocument();
        var condicao = construtor.NearSphere(x => x.loc, localizacao, 100000);

        //var listaAeroportos = await conexaoAeroporto.Airports.Find(new BsonDocument()).ToListAsync();
        var listaAeroportos = await conexaoAeroporto.Airports.Find(condicao).ToListAsync();

        foreach (var doc in listaAeroportos)
        {
            Console.WriteLine(doc.ToJson<Aeroporto>());
        }

        Console.WriteLine("Fim da lista");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

Na internet o pessoal está dizendo para criar um índice ou lago assim...

... mas não entendi bem:

==========================================================

MongoDB 'unable to find index for $geoNear query'

db.bar.createIndex({point:"2dsphere"});

https://stackoverflow.com/questions/23188875/mongodb-unable-to-find-index-for-geonear-query

==========================================================

Error no geo indices for geoNear #4917

https://github.com/Automattic/mongoose/issues/4917

==========================================================

[SOLVED]-MONGODB 'UNABLE TO FIND INDEX FOR $GEONEAR QUERY'-MONGODB

https://www.appsloveworld.com/mongodb/100/2/mongodb-unable-to-find-index-for-geonear-query

==========================================================

Agradeço qualquer ajuda,

Obrigado,

Fabio I.

1 resposta
solução!

PessoALL,

UFA! Depois de bater muito a cabeça, descobri como fazer!

REALMENTE o segredo é criar um índice Versão 3 para o MongoDB 4.0.

Vou explicar passo a passo de como fazer isso.

Primeiro a indicação no "stackoverflow" foi a chave. É bom acessar e ler o documento:

==========================================================

2dsphere Indexes

https://www.mongodb.com/docs/manual/core/2dsphere/

==========================================================

Como eu montei...

Eu montei o índice usando o Wizard do MongoDB Compass - Version 1.33.1

Nesta tela do software "Compass" mostra o índice criado. Clique no botão "Create Index".

Compass - Indexes geo.airports

  • Observação de um detalhe na tela acima... Veja que mostra "1 indexes"... eu NÃO tinha feito o "REFRESH" da tela. (clique na seta curvada ao lado da palavra "COLLECTIONS").

Quando aparecer esta tela do "Compass", a tela "Create Index" (geo.airports), é simples, basta colocar:

Index Fields:

  • Select or type a field name: loc;
  • Select a type: 2dsphere;

NÃO precisa selecionar nenhuma opção (Option).

Clique no botão "Create Index".

Compass - Indexes - Create Index

Vai aparecer desta forma no software "Studio 3T":

Studio 3T - Lista de Índices

Detalhe: Se NÃO aparecer, não esqueça de fazer REFRESH em ambos softwares.

É possível também criar este índice dentro do Studio 3T.

Agora ao rodar o programa "exemplosMongoNET" do vídeo, retornará o resultado correto.

[]'s,

Fabio I.