Visão geral
Neste guia, você pode aprender como usar o driver Java Reactive Streams para executar queries do MongoDB Search em uma collection. O MongoDB Search permite realizar pesquisas de texto completo em suas collections do MongoDB . Os índices de pesquisa do MongoDB especificam o comportamento da pesquisa e quais campos indexar.
Dados de amostra
Os exemplos neste guia utilizam a movies coleção do sample_mflix no banco de dados do a partir do conjunto de dados de amostra do Atlas . Para saber como criar um sistema gratuito do MongoDB e carregar os conjuntos de dados de exemplo, consulte o guia de introdução ao MongoDB. Para saber mais sobre operações de agregação e construtores, consulte o guia Aggregation Framework.
Executar uma query de pesquisa do MongoDB
Esta seção mostra como criar um pipeline de agregação para executar uma query de pesquisa do MongoDB Search em uma coleção. Você pode usar o método construtor Aggregates.search() para criar um estágio de pipeline $search, que especifica os critérios de pesquisa. Em seguida, chame o método aggregate() e passe seu pipeline como um parâmetro.
Observação
Requisitos da versão do Atlas e Community Edition
O operador de pipeline de agregação $search está disponível somente para coleções hospedadas em clusters do MongoDB Atlas que executam o MongoDB v4.2 ou posterior, ou em clusters do MongoDB Community Edition que executam o MongoDB v8.2 ou posterior. As coleções devem ser cobertas por um índice de pesquisa do MongoDB. Para saber mais sobre a configuração necessária e a funcionalidade desse operador, consulte a documentação do MongoDB pesquisa.
Antes de executar uma query do MongoDB Search, você deve criar um índice do MongoDB Search em sua collection. Para saber como criar programaticamente um índice do MongoDB Search, consulte a seção Gerenciamento de índice do MongoDB Search no guia Índices.
Exemplo de pesquisa do MongoDB
Este exemplo executa uma query de pesquisa do MongoDB Search executando as seguintes ações:
Constrói um
$searchestágio usando oAggregates.search()método construtor, instruindo o driver a fazer query de documentos nos quais otitlecampo contém a"Alabama"palavra. Para saber mais sobre os operadores que você pode usar no$searchestágio, consulte a seção Criar estágios de pesquisa do pipeline deste guia.Constrói um estágio
$projectusando o método construtorAggregates.project(), instruindo o driver a incluir o campotitlenos resultados da queryPassa as fases do pipeline para o método
aggregate()e imprime os resultados
Publisher<Document> publisher = collection.aggregate( List.of( Aggregates.search(SearchOperator.text( SearchPath.fieldPath("title"), "Alabama")), Aggregates.project(Projections.include("title")) ) ); Flux.from(publisher) .doOnNext(doc -> System.out.println(doc.toJson())) .blockLast();
{"_id": {"$oid": "..."}, "title": "Alabama Moon"} {"_id": {"$oid": "..."}, "title": "Crazy in Alabama"} {"_id": {"$oid": "..."}, "title": "Sweet Home Alabama"}
Metadados de pesquisa do MongoDB
Use o Aggregates.searchMeta() método para criar um estágio de pipeline $searchMeta, que retorna somente os metadados dos resultados da pesquisa MongoDB .
Observação
Requisitos da versão do Atlas e Community Edition
Este operador de pipeline de agregação está disponível somente em clusters do MongoDB Atlas executando v4.4.11 e posterior, ou em clusters do MongoDB Community Edition executando MongoDB v8.2 ou posterior. Para uma lista detalhada de disponibilidade de versão, consulte a documentação do MongoDB Atlas em $searchMeta.
O exemplo a seguir mostra os metadados near para um estágio de agregação do MongoDB Search, que retorna o número de documentos com um valor de campo year dentro de 1 ano de 2010:
Aggregates.searchMeta( SearchOperator.near(2010, 1, fieldPath("year")));
Document{{count=Document{{lowerBound=21326}}}}
Para saber mais sobre esse método assistente, consulte a documentação da API searchMeta().
Criar estágios de pesquisa de pipeline
O driver Java Reactive Streams fornece métodos de assistente para os seguintes operadores:
Operador | Descrição |
|---|---|
Executa uma pesquisa por uma palavra ou frase que contém uma sequência de caracteres de uma string de entrada incompleta. | |
Combina dois ou mais operadores em uma única query. | |
Verifica se um campo corresponde a um valor que você especificou. Mapeia para os métodos | |
Testa se existe um caminho para um nome de campo indexado especificado em um documento. | |
Executa uma pesquisa por uma array de valores de número BSON, data, boolean, ObjectId, uuid ou string no caminho fornecido e retorna documentos em que o valor do campo é igual a qualquer valor na array especificada. | |
Retorna documentos semelhantes aos documentos de entrada. | |
Suporta a consulta e pontuação de valores numéricos, de data e de ponto GeoJSON . | |
Executa uma pesquisa de documentos contendo uma sequência ordenada de termos usando o analisador especificado na configuração do índice. | |
Suporta a realização de query de uma combinação de campos e valores indexados. | |
Suporta a consulta e pontuação de valores numéricos, de data e de cadeia de caracteres. Mapeia para os métodos | |
Interpreta o campo de query como uma expressão regular. | |
Executa uma pesquisa de texto completo usando o analisador especificado na configuração do índice. | |
Habilita queries que usam caracteres especiais na string de pesquisa que podem corresponder a qualquer caractere. |
Exemplo de estágio de pesquisa de pipeline
Antes de executar este exemplo, você deve criar um índice de pesquisa MongoDB na coleção movies que tem a seguinte definição:
{ "mappings": { "dynamic": true, "fields": { "title": { "analyzer": "lucene.keyword", "type": "string" }, "genres": { "normalizer": "lowercase", "type": "token" } } } }
Para saber mais sobre como criar índices de pesquisa do MongoDB Search, consulte a seção Gerenciamento de índice de pesquisa do MongoDB Search do guia Índices.
O seguinte código cria um estágio $search que tem as seguintes especificações:
Verifica se a array
genresinclui"Comedy"Pesquisa no campo
fullplota frase"new york"Corresponde a
yearvalores entre1950e2000, inclusivePesquisa valores
titleque começam com o termo"Love"
List<Bson> pipeline = List.of( Aggregates.search( SearchOperator.compound() .filter( List.of( SearchOperator.in(fieldPath("genres"), List.of("Comedy")), SearchOperator.phrase(fieldPath("fullplot"), "new york"), SearchOperator.numberRange(fieldPath("year")).gtLt(1950, 2000), SearchOperator.wildcard(fieldPath("title"), "Love *") ))), Aggregates.project( Projections.include("title", "year", "genres") )); Publisher<Document> publisher = collection.aggregate(pipeline); Flux.from(publisher) .doOnNext(doc -> System.out.println(doc.toJson())) .blockLast();
{"_id": ..., "genres": ["Comedy", "Romance"], "title": "Love at First Bite", "year": 1979} {"_id": ..., "genres": ["Comedy", "Drama"], "title": "Love Affair", "year": 1994}
Para saber mais sobre os métodos assistente de pesquisa do MongoDB, consulte a referência da interface SearchOperator na documentação da Core API driver.
Informações adicionais
Para aprender mais sobre o MongoDB pesquisa, consulte MongoDB pesquisa na documentação do Atlas.
Documentação da API
Para saber mais sobre os métodos mencionados neste guia, consulte a seguinte documentação da API: