EventoObtenha 50% de desconto no seu ingresso para MongoDB.local Londres em outubro 2. Use o código WEB50Saiba mais >>
Desenvolvedor MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
Atlaschevron-right

Consulta flexível com Atlas Search

Ethan Steininger3 min read • Published Oct 04, 2022 • Updated Jul 12, 2024
GraphQLAtlasPesquisaJavaScript
SNIPPET
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty

Introdução

Neste tutorial, mostrarei como a flexibilidade dos índices invertidos do Atlas Search é uma opção poderosa em comparação aos índices de árvore B tradicionais quando se trata de suporte a consultas ad hoc.

O que é consulta flexível?

Os mecanismos de query flexíveis oferecem a capacidade de executar uma query de alto desempenho que abrange vários índices em seu armazenamento de dados. Isso significa que você pode escrever queries ad-hoc e geradas dinamicamente, onde você não precisa conhecer a query, os campos ou a ordem dos campos com antecedência.
Certifique-se de verificar a documentação do MongoDBsobre este assunto!
É muito raro o planejador de query do MongoDB selecionar um plano que envolva vários índices. Neste tutorial, percorreremos um cenário em que isso se torna um requisito.

Sua aplicação está em constante evolução

Digamos que você tenha um aplicativo de filmes com documentos como:

Requisitos iniciais do produto

Agora, para a versão 1.0 aplicativo, você precisa consultar o título e o ano, portanto, primeiro crie um índice composto por meio de:
db.movies.createIndex( { "title": 1, "year": 1 } )
Então emita a query:
db.movies.find({"title":"Fight Club", "year":1999})
Ao executar um plano de explicação, você tem uma consulta perfeita com uma 1:1 proporção de documentos examinados para documentos retornados:

Nossa consulta então precisa evoluir

Agora, nossos requisitos de aplicativo evoluíram e você precisa consultar no cast e no imdb. Primeiro você cria o índice:
db.movies.createIndex( { "cast": 1, "imdb.rating": 1 } )
Então emita a query:
db.movies.find({"cast":"Edward Norton", "imdb.rating":{ $gte:9 } })
Não é a maior proporção de documentos examinados para documentos retornados, mas ainda não é ruim:

Agora nossa query envolve novamente

Agora, nosso aplicativo exige que você emita uma nova consulta, que se torna um subconjunto do original:
db.movies.find({"imdb.rating" : { $gte:9 } })
A consulta acima resulta na temida varredura de coleção, apesar de o índice composto anterior (cast_imdb.rating) incluir a chave da consulta acima. Isso ocorre porque o campo "imdb.rating" não é o prefixo do índice, e a consulta não contém condições de filtro no campo "cast"."
Observação: as varreduras de coleção devem ser evitadas porque elas não apenas instruem o cursor a examinar todos os documentos da coleção que são lentos, mas também forçam os documentos a sair da memória, resultando em aumento da pressão de E/S.
Os resultados do nosso plano de query são os seguintes:
Agora você realmente poderia criar um novo índice composto apenas por imdb.rating, que retornaria uma verificação de índice para a query acima, mas são três índices diferentes nos quais o planejador de queries teria que navegar para selecionar a resposta de melhor desempenho.
Como o Lucene usa uma estrutura de dados de índice diferente (índices invertidos versus índicesde árvore B), ele foi criado especificamente para executar queries que se sobrepõem em vários índices.
Ao contrário dos índices compostos, a ordem dos campos na definição do índice do Atlas Search não é importante. Os campos podem ser definidos em qualquer ordem. Portanto, ele não está sujeito à limitação acima, em que uma consulta que esteja apenas em um campo sem prefixo de um índice composto não pode usar o índice.
Se você criar um único índice que mapeie todos os nossos quatro campos acima (titulo, ano, elenco, imdb):
Em seguida, você emite uma query que primeiro abrange o título e o ano por meio de uma cláusula obrigatória (E), que é equivalente a db.collection.find({"title":"Fight Club", "year":1999}):
Os resultados correspondentes do planejador de query:
Então, quando você adicionar imdb e cast à query, ainda poderá obter resultados de desempenho:
Os resultados correspondentes do planejador de query:

Este não é um cenário singular

Os aplicativos evoluem conforme as expectativas e os requisitos de nossos usuários. Para dar suporte à evolução dos requisitos de seus aplicativos, os índices padrão de árvore B simplesmente não podem evoluir na mesma taxa que um índice invertido.

Casos de uso

Aqui estão vários exemplos em que as estruturas de dados de índice invertido do Atlas Search podem ser úteis, com links para material de referência:
  • GraphQL: se o ponto de entrada do seu banco de dados é GraphQL, onde as queries são definidas pelo cliente, então você é um candidato ideal para índices invertidos
  • Pesquisa avançada: você precisa expandir os critérios de filtragem da sua barra de pesquisa além de vários campos.
  • Pesquisa de curinga: pesquisa em campos que correspondem a combinações de caracteres e curingas.
  • Query ad-hoc: a necessidade de gerar dinamicamente queries sob demanda por nossos clientes.

Recursos


Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Desenvolver um sistema de gerenciamento de estoque usando MongoDB Atlas


Aug 05, 2024 | 16 min read
Artigo

Como pausar e retomar clusters do Atlas de maneira fácil


Sep 11, 2024 | 5 min read
Tutorial

Acelere sua experiência em AI : simplifique a geração de AI RAG com o MongoDB Atlas e o mecanismo de lógica de AI Vertex do Google


Aug 16, 2024 | 6 min read
Tutorial

Como usar o MongoDB Atlas e os LLMs do IBM watsonx.ai em seus aplicativos de GenAI sem interrupções


Sep 18, 2024 | 9 min read
Sumário
  • Recursos