Consultas Textuais e Geoespaciais no MongoDB com C#

Neste tutorial, exploraremos como realizar consultas🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. textuais e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. geoespaciais no MongoDB usando aplicações em C#. Essas funcionalidades permitem encontrar documentos a partir de texto em campos específicos e localizar objetos com base em coordenadas geográficas de forma simples e eficiente. Nesta jornada, você aprenderá desde a criação de índicesUtilizando índices para melhorar o desempenho em consultasUtilizando índices para melhorar o desempenho em consultasTorne suas consultas MongoDB mais eficientes com C#. Descubra como índices otimizam a performance e reduzem o tempo de resposta. até a execução das consultas, com exemplos práticos em C#.

Visão Geral🔗

MongoDBO que é MongoDB e por que utilizá-lo com C# em 2025O que é MongoDB e por que utilizá-lo com C# em 2025Descubra como MongoDB e C# unem flexibilidade e escalabilidade para criar soluções modernas e eficientes em um cenário NoSQL inovador em 2025. oferece:

Quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. integrados ao driver oficial do MongoDBConfigurando o ambiente de desenvolvimento em .NET para MongoDBConfigurando o ambiente de desenvolvimento em .NET para MongoDBAprenda a preparar seu ambiente .NET para trabalhar com MongoDB, instalando o SDK, criando projetos comuns e adicionando o driver oficial. para C#, esses recursos📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. se tornam acessíveis por meio de métodos e expressões tipadas que facilitam o desenvolvimento.

Configurando o Índice Textual🔗

Para realizar buscas textuais, é necessário criar um índice específico. Suponhamos que tenhamos uma coleção que armazena documentosEntendendo a arquitetura do MongoDB: documentos, coleções e bancos de dadosEntendendo a arquitetura do MongoDB: documentos, coleções e bancos de dadosExplore os pilares da arquitetura MongoDB, integrando bancos de dados, coleções e documentos para impulsionar seu desenvolvimento em C# até 2025. de produtos🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. e queremos indexar o campo de descrição para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! permitir pesquisas textuais:

using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver.Linq;
public class Produto
{
    [BsonId]
    public ObjectId Id { get; set; }
    public string Nome { get; set; }
    public string Descricao { get; set; }
}
public class ExemploBuscasTextuais
{
    public void CriarIndiceTextual()
    {
        // Obtenha a instância do banco
        var client = new MongoClient("sua-string-de-conexao");
        var database = client.GetDatabase("ExemploDB");
        var produtosCollection = database.GetCollection<Produto>("Produtos");
        // Defina a chave para o índice textual no campo Descricao
        var indexKeys = Builders<Produto>.IndexKeys.Text(x => x.Descricao);
        // Crie o modelo que representa a criação do índice
        var criarIndice = new CreateIndexModel<Produto>(indexKeys);
        // Crie o índice na coleção
        produtosCollection.Indexes.CreateOne(criarIndice);
    }
}

Observações importantes:

Realizando Buscas Textuais em C#🔗

Com o índice textual configurado, podemos realizar consultas🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. usando o operador $text. A API🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real. do _driver_ C# disponibiliza esse operador por meio de Builders<T>.Filter.Text(...).

public class ExemploBuscasTextuais
{
    public void BuscarProdutosContendoTexto()
    {
        var client = new MongoClient("sua-string-de-conexao");
        var database = client.GetDatabase("ExemploDB");
        var produtosCollection = database.GetCollection<Produto>("Produtos");
        // Criamos um filtro texto com a palavra-chave
        var textoProcurado = "MongoDB";
        var filtro = Builders<Produto>.Filter.Text(textoProcurado);
        // Realizamos a consulta
        var resultados = produtosCollection.Find(filtro).ToList();
        // Exibimos o resultado
        foreach (var produto in resultados)
        {
            Console.WriteLine($"Produto encontrado (Id: {produto.Id}): {produto.Nome}");
        }
    }
}

Buscas Com Relevância (Score)

Podemos querer ordenar🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. os resultados pelo grau de relevância do termo. Para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! isso:

1. Inclua o campo de pontuação (score) na projeçãoComo Escolher o Operador Correto em Diferentes Cenários de ConsultaComo Escolher o Operador Correto em Diferentes Cenários de ConsultaAprenda a selecionar os operadores LINQ ideais para filtrar, projetar, ordenar e agrupar dados, garantindo código claro e aplicação eficiente..

2. Utilize o $meta: "textScore" para ordenar🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. por relevância.

var filtro = Builders<Produto>.Filter.Text("MongoDB");
var projecao = Builders<Produto>.Projection
    .MetaTextScore("score")
    .Include(x => x.Nome)
    .Include(x => x.Descricao);
var ordenacao = Builders<Produto>.Sort.MetaTextScore("score");
var resultadosRelevantes = produtosCollection
    .Find(filtro)
    .Project<Produto>(projecao)
    .Sort(ordenacao)
    .ToList();

Destaque: Esse recurso📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. é útil quando precisamos priorizar resultados mais próximos da palavra pesquisada.

Introdução às Buscas Geoespaciais🔗

Buscas geoespaciais permitem encontrar documentosEntendendo a arquitetura do MongoDB: documentos, coleções e bancos de dadosEntendendo a arquitetura do MongoDB: documentos, coleções e bancos de dadosExplore os pilares da arquitetura MongoDB, integrando bancos de dados, coleções e documentos para impulsionar seu desenvolvimento em C# até 2025. que representem objetos em um espaço geográfico, a partir de coordenadas. Exemplos de uso🔏 Criptografia Assimétrica: Domine RSA e Troca de Chaves!🔏 Criptografia Assimétrica: Domine RSA e Troca de Chaves!Descubra como a criptografia assimétrica protege a troca de chaves e garante segurança em sistemas digitais usando RSA, C# e práticas recomendadas.:

Para habilitar esse tipo🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)Descubra como as variáveis em C# funcionam, com exemplos do mundo real, boas práticas de nomeação e dicas para otimizar seu código. de busca, precisamos usar campos especiais e índicesUtilizando índices para melhorar o desempenho em consultasUtilizando índices para melhorar o desempenho em consultasTorne suas consultas MongoDB mais eficientes com C#. Descubra como índices otimizam a performance e reduzem o tempo de resposta. apropriados:

Criando Índice Geoespacial em C#🔗

No MongoDBO que é MongoDB e por que utilizá-lo com C# em 2025O que é MongoDB e por que utilizá-lo com C# em 2025Descubra como MongoDB e C# unem flexibilidade e escalabilidade para criar soluções modernas e eficientes em um cenário NoSQL inovador em 2025., representamos dados geoespaciais seguindo o padrão GeoJSON. Exemplo de classe com ponto 2DSphere:

using MongoDB.Driver.GeoJsonObjectModel;
public class PontoInteresse
{
    [BsonId]
    public ObjectId Id { get; set; }
    public string Nome { get; set; }
    // Ex: localizacao = { type: "Point", coordinates: [longitude, latitude] }
    public GeoJsonPoint<GeoJson2DCoordinates> Localizacao { get; set; }
}
public class ExemploBuscasGeoespaciais
{
    public void CriarIndice2DSphere()
    {
        var client = new MongoClient("sua-string-de-conexao");
        var database = client.GetDatabase("ExemploDB");
        var pontosCollection = database.GetCollection<PontoInteresse>("PontosInteresse");
        // Definindo a chave de índice 2DSphere no campo Localizacao
        var indexKeys = Builders<PontoInteresse>.IndexKeys.Geo2DSphere(x => x.Localizacao);
        // Criamos o modelo de índice
        var criarIndice = new CreateIndexModel<PontoInteresse>(indexKeys);
        // Criamos o índice
        pontosCollection.Indexes.CreateOne(criarIndice);
    }
}

Inserindo Documentos com Coordenadas🔗

Para popular o banco com dados geoespaciais, precisamos criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. instâncias de GeoJsonPoint<GeoJson2DCoordinates>:

var pontosCollection = database.GetCollection<PontoInteresse>("PontosInteresse");
// Supondo coordenadas próximas a São Paulo (longitude, latitude)
var novoPonto = new PontoInteresse
{
    Nome = "Pizzaria central",
    Localizacao = new GeoJsonPoint<GeoJson2DCoordinates>(
        new GeoJson2DCoordinates(-46.625290, -23.533773)
    )
};
// Inserção
pontosCollection.InsertOne(novoPonto);

Importante: a ordem das coordenadas no MongoDBO que é MongoDB e por que utilizá-lo com C# em 2025O que é MongoDB e por que utilizá-lo com C# em 2025Descubra como MongoDB e C# unem flexibilidade e escalabilidade para criar soluções modernas e eficientes em um cenário NoSQL inovador em 2025. para GeoJSON segue longitude primeiro, depois latitude.

Buscas Geoespaciais em C#🔗

Buscando Documentos com Filtro de Proximidade

Um dos cenários📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. mais comuns é localizar pontos próximos de uma determinada coordenada. Podemos utilizar o operador $near no driver C#:

public class ExemploBuscasGeoespaciais
{
    public void BuscarPontosProximos()
    {
        var client = new MongoClient("sua-string-de-conexao");
        var database = client.GetDatabase("ExemploDB");
        var pontosCollection = database.GetCollection<PontoInteresse>("PontosInteresse");
        // Define um ponto de referência (longitude, latitude)
        var referencia = new GeoJsonPoint<GeoJson2DCoordinates>(
            new GeoJson2DCoordinates(-46.624111, -23.534999)
        );
        // Cria um filtro Near
        var filtroProximidade = Builders<PontoInteresse>.Filter.Near(
            x => x.Localizacao,
            referencia,
            maxDistance: 5000 // Distância max em metros (aprox.)
        );
        // Executa a consulta
        var resultados = pontosCollection.Find(filtroProximidade).ToList();
        foreach (var ponto in resultados)
        {
            Console.WriteLine($"Ponto próximo: {ponto.Nome}");
        }
    }
}

O maxDistance limita a busca em um raio próximo ao ponto especificado (no exemplo, 5000 metros).

Utilizando $geoWithin

Para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! encontrar todos os pontos dentro de um polígono (ou círculo), podemos usar $geoWithin. Por exemplo, caso desejemos um polígono no formato GeoJSON:

// Exemplo de polígono simples
var poligono = new GeoJsonPolygon<GeoJson2DCoordinates>(
    new GeoJsonLinearRingCoordinates<GeoJson2DCoordinates>(
        new[]
        {
            new GeoJson2DCoordinates(-46.702, -23.600),
            new GeoJson2DCoordinates(-46.702, -23.400),
            new GeoJson2DCoordinates(-46.500, -23.400),
            new GeoJson2DCoordinates(-46.500, -23.600),
            new GeoJson2DCoordinates(-46.702, -23.600) // primeiro ponto repetido para fechar
        }
    )
);
var filtro = Builders<PontoInteresse>.Filter.GeoWithin(x => x.Localizacao, poligono);
var resultados = pontosCollection.Find(filtro).ToList();
foreach (var ponto in resultados)
{
    Console.WriteLine($"Ponto dentro do polígono: {ponto.Nome}");
}

Consultas Combinadas

Podemos combinar filtros🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. textuais e geoespaciais para obter resultados ainda mais específicos. Exemplo: encontrar pizzarias que estejam próximas ao usuário:

var filtroTexto = Builders<PontoInteresse>.Filter.Text("pizzaria");
var filtroLocal = Builders<PontoInteresse>.Filter.Near(
    x => x.Localizacao,
    new GeoJsonPoint<GeoJson2DCoordinates>(new GeoJson2DCoordinates(-46.63, -23.53)),
    maxDistance: 2000
);
// Filtro final combinando ambos
var filtroComposto = Builders<PontoInteresse>.Filter.And(filtroTexto, filtroLocal);
var resultadosCompostos = pontosCollection.Find(filtroComposto).ToList();

Boas Práticas e Considerações🔗

1. Estrutura de ÍndicesUtilizando índices para melhorar o desempenho em consultasUtilizando índices para melhorar o desempenho em consultasTorne suas consultas MongoDB mais eficientes com C#. Descubra como índices otimizam a performance e reduzem o tempo de resposta.:

2. Performance🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!Descubra como o StringBuilder otimiza a concatenação em C#, evitando desperdício de memória e melhorando a performance das aplicações. Veja exemplos práticos!:

3. Limpeza de Dados:

4. Ordenação🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. e Paginação:

Conclusão🔗

As funcionalidades de buscas textuais e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. geoespaciais em MongoDBO que é MongoDB e por que utilizá-lo com C# em 2025O que é MongoDB e por que utilizá-lo com C# em 2025Descubra como MongoDB e C# unem flexibilidade e escalabilidade para criar soluções modernas e eficientes em um cenário NoSQL inovador em 2025., aliadas ao driver C#, oferecem soluções robustas para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! indexaçãoUtilizando índices para melhorar o desempenho em consultasUtilizando índices para melhorar o desempenho em consultasTorne suas consultas MongoDB mais eficientes com C#. Descubra como índices otimizam a performance e reduzem o tempo de resposta. e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. consulta🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. de dados complexos. Você pode:

A implementação prática, como visto, envolve a criação de índicesUtilizando índices para melhorar o desempenho em consultasUtilizando índices para melhorar o desempenho em consultasTorne suas consultas MongoDB mais eficientes com C#. Descubra como índices otimizam a performance e reduzem o tempo de resposta. adequados e a utilização das APIs de filtro🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. (Filter.Text, Filter.Near, Filter.GeoWithin, etc.). Lembre-se de manter uma boa arquitetura de dados e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. de testar cuidadosamente performance🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!Descubra como o StringBuilder otimiza a concatenação em C#, evitando desperdício de memória e melhorando a performance das aplicações. Veja exemplos práticos! e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. escalaCriando e Escalando Serviços no Docker SwarmCriando e Escalando Serviços no Docker SwarmDescubra como criar, gerenciar e escalar serviços no Docker Swarm, utilizando comandos simples para manter alta disponibilidade em seu cluster. para que seu aplicativo atenda aos cenários📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. em constante crescimento até 2025.

Desejamos sucesso em suas aplicações que combinem texto📝 Strings em C#: Manipule Textos como um Mestre dos Caracteres!📝 Strings em C#: Manipule Textos como um Mestre dos Caracteres!Aprenda a dominar os segredos das strings em C# com técnicas de manipulação, concatenação, interpolação e boas práticas, impulsionando sua performance. e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. localização, explorando ao máximo🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. a versatilidade do MongoDBO que é MongoDB e por que utilizá-lo com C# em 2025O que é MongoDB e por que utilizá-lo com C# em 2025Descubra como MongoDB e C# unem flexibilidade e escalabilidade para criar soluções modernas e eficientes em um cenário NoSQL inovador em 2025. em conjunto com o ecossistema .NET!

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados