Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

MongoDB Search

Neste guia, você pode aprender a usar o construtor Search para criar um estágio de aggregation pipeline $search com o driver MongoDB .NET/C#.

Para saber mais sobre a $search pipeline stage, consulte $search.

Observação

Requisitos da versão do Atlas e Community Edition

O $search operador de pipeline de agregação está disponível somente para coleções hospedadas em clusters do MongoDB Atlas que executam o MongoDB 4 v.2 ou posterior, ou em clusters do MongoDB Community Edition que executam o MongoDB8 v.2 ou posterior. As collections devem ser cobertas por um índice do MongoDB Search. Para saber mais sobre a configuração necessária e a funcionalidade desse operador, consulte a documentação do MongoDB Search.

Os exemplos neste guia usam a coleção movies do banco de dados sample_mflix . Os documentos desta coleção contêm informações sobre filmes, incluindo título, trama, gênero e classificações. A seguinte classe Movie modela os documentos nesta coleção:

[BsonIgnoreExtraElements]
public class Movie
{
[BsonId]
public ObjectId Id { get; set; }
public string Title { get; set; } = null!;
public string Plot { get; set; } = null!;
public string[] Genres { get; set; } = null!;
public int Year { get; set; }
public string Rated { get; set; } = null!;
public Imdb Imdb { get; set; } = null!;
[BsonElement("plot_embedding")]
public float[] PlotEmbedding { get; set; } = null!;
public double Score { get; set; }
[BsonElement("scoreDetails")]
[BsonIgnoreIfNull]
public SearchScoreDetails ScoreDetails { get; set; } = null!;
[BsonElement("paginationToken")]
public string PaginationToken { get; set; } = null!;
}

A classe Movie faz referência à seguinte classe Imdb, que modela o campo imdb aninhado em cada documento:

[BsonIgnoreExtraElements]
public class Imdb
{
public double Rating { get; set; }
public int Votes { get; set; }
public int Id { get; set; }
}

Observação

Nomes de campo camel-case em dados de amostra

Os documentos na coleção movies usam a convenção de nomenclatura de camelo. Os exemplos neste guia usam um ConventionPack para desserializar os campos na coleção em maiúsculas e minúsculas Pascal e mapeá-los para as propriedades na classe Movie .

Para saber mais sobre serialização personalizada, consulte Serialização personalizada.

Some examples in this guide use additional collections and model classes, which the relevant sections introduce. All collections are from the sample datasets provided by Atlas. See Get Started with the .NET/C# Driver to learn how to create a free MongoDB cluster and load this sample data.

Observação

Tipos de campo inconsistentes em dados de amostra

Alguns documentos na coleção movies armazenam os campos imdb.rating e imdb.votes como strings em vez de números. Se você definir esses campos como double ou int em sua classe de modelo, o driver lançará um FormatException ao desserializar esses documentos.

Para lidar com documentos com tipos de campo mistos, implemente um serializador personalizado que aceite vários BSON types e aplique-o com o atributo [BsonSerializer] nas propriedades afetadas:

[BsonIgnoreExtraElements]
public class Imdb
{
[BsonSerializer(typeof(FlexibleDoubleSerializer))]
public double Rating { get; set; }
[BsonSerializer(typeof(FlexibleInt32Serializer))]
public int Votes { get; set; }
public int Id { get; set; }
}

Para saber como implementar um serializador personalizado como FlexibleDoubleSerializer, consulte Serializadores personalizados.

Antes de executar uma pesquisa em uma coleção do Atlas, primeiro você deve criar um índice de pesquisa MongoDB na coleção. Um índice de pesquisa do MongoDB é uma estrutura de dados que categoriza os dados em um formato pesquisável.

Para aprender como criar um índice de pesquisa MongoDB , consulte o guia Criar um índice de pesquisa MongoDB.

A classe Search contém métodos que você pode utilizar para executar operações do $search. Para obter uma lista completa das operadoras e coletoras $search disponíveis, consulte o guia do Atlas de Operadoras e Coletoras.

Use o método Autocomplete() para pesquisar uma palavra ou frase que contenha uma sequência de caracteres de uma string de entrada incompleta.

O exemplo seguinte executa uma consulta de preenchimento automático no campo title para texto que começa com a string "Gravity":

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Autocomplete(m => m.Title, "Gravity"), indexName: "movietitles")
.ToList();

Para saber mais sobre o operador autocomplete , consulte o guia do Atlas de preenchimento automático.

Observação

Índice para queries de preenchimento automático

Você deve criar um índice de pesquisa MongoDB que ofereça suporte ao preenchimento automático para executar queries com preenchimento automático com êxito. Para saber mais, consulte Como criar índice de campos para preenchimento automático na documentação do Atlas.

Após criar o índice do MongoDB Search, você deve passar o nome do índice para o método Autocomplete(), como mostrado no exemplo anterior.

Use o método Compound() para combinar dois ou mais operadores em uma única pesquisa.

O exemplo a seguir pesquisa a coleção movies por quaisquer documentos que correspondam a todos os seguintes critérios:

  • O campo imdb.rating existe no documento

  • O valor do campo rated não é "G"

  • O campo year tem um valor superior a 2000

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Compound()
.Must(Builders<Movie>.Search.Exists(m => m.Imdb.Rating))
.MustNot(Builders<Movie>.Search.Equals(m => m.Rated, "G"))
.Must(Builders<Movie>.Search.Range(m => m.Year, SearchRangeBuilder.Gt(2000))))
.ToList();

Para saber mais sobre o operador compound, consulte o guia Atlas composto.

Use o método EmbeddedDocument() para realizar operações de pesquisa em documentos dentro do valor da array de um campo.

Observação

Índice de documento incorporado necessário

Para usar o Atlas Search em documentos incorporados, você deve criar um índice embeddedDocument no campo de array.

Para saber como definir um índice embeddedDocument, consulte Definir o índice para o tipo embeddedDocument na documentação do Atlas.

Os exemplos nesta seção usam a coleção restaurants do banco de dados sample_restaurants. As classes a seguir modelam os documentos nessa coleção:

[BsonIgnoreExtraElements]
public class Restaurant
{
[BsonId]
public ObjectId Id { get; set; }
public string Name { get; set; } = null!;
public string Cuisine { get; set; } = null!;
public string Borough { get; set; } = null!;
public List<GradeEntry> Grades { get; set; } = null!;
}
[BsonIgnoreExtraElements]
public class GradeEntry
{
public string Grade { get; set; } = null!;
public int? Score { get; set; }
}

O exemplo a seguir pesquisa nessa coleção quaisquer restaurantes cuja array grades contenha uma entrada com um campo grade de "A":

var result = restaurantsCollection.Aggregate()
.Search(Builders<Restaurant>.Search.EmbeddedDocument(
r => r.Grades,
Builders<GradeEntry>.Search.Equals(g => g.Grade, "A")
), indexName: "restaurantsembedded").ToList();

Para saber mais sobre o operador embeddedDocument, consulte o guia do Atlas embeddedDocument.

As seções a seguir descrevem parâmetros e operadores adicionais que você pode usar para ampliar as pesquisas de documento incorporado.

Use o parâmetro returnScope do método Search() ou SearchMeta() para retornar documentos incorporados de um campo array como resultados individuais, em vez de documentos no nível raiz. Quando você especifica returnScope, o MongoDB Search pontua, classifica e conta cada documento incorporado independentemente.

Esse parâmetro aceita uma expressão lambda que especifica o caminho para o campo de array que contém os documentos incorporados.

Para usar returnScope, você deve executar as seguintes etapas:

  • Indexar o campo do array como o tipo embeddedDocuments.

  • Defina a opção storedSource em sua definição de índice para o campo aninhado que deseja recuperar.

  • Defina ReturnStoredSource para true em suas opções de pesquisa.

O exemplo a seguir recupera documentos da coleção restaurants que têm um valor "A" em seu array grades. O código passa a expressão r => r.Grades para o método Search() como o parâmetro returnScope, que instrui o driver a retornar os documentos incorporados no array grades como resultados individuais.

var result = restaurantsCollection.Aggregate()
.Search(
Builders<Restaurant>.Search.Equals("grades.grade", "A"),
r => r.Grades,
new SearchOptions<Restaurant>
{
ReturnStoredSource = true,
IndexName = "restaurantsembedded"
})
.ToList();

Para aprender mais, consulte fts-return-scope na documentação do Atlas.

Use o método HasAncestor() dentro de uma consulta EmbeddedDocument() para filtrar um campo em um nível intermediário de aninhamento ancestral. Um campo ancestral é um campo do tipo embeddedDocuments que é pai do campo incorporado que você especifica no parâmetro returnScope, mas não é o documento raiz.

Passe os seguintes parâmetros para o método HasAncestor() :

Parâmetro
Obrigatório
Descrição

path

Sim

O caminho para o campo ancestral

operator

Sim

O operador de pesquisa a ser aplicado aos campos dentro do campo ancestral especificado em path

score

No

O modificador de pontuação a ser aplicado aos resultados da pesquisa

Para aprender mais, consulte has-ancestor-ref na documentação do Atlas.

Use o método HasRoot() em uma consulta EmbeddedDocument() para filtrar campos de nível raiz ao realizar uma pesquisa de documentos incorporados.

Passe os seguintes parâmetros para o método HasRoot() :

Parâmetro
Obrigatório
Descrição

operator

Sim

O operador de pesquisa a ser aplicado aos campos de nível raiz.

score

No

O modificador de pontuação a ser aplicado aos resultados da pesquisa.

O exemplo a seguir recupera documentos da coleção restaurants que têm pelo menos um valor "A" na array grades. A consulta usa o método HasRoot() para filtrar o campo de nível raiz borough para valores "Manhattan".

var result = restaurantsCollection.Aggregate()
.Search(
Builders<Restaurant>.Search.EmbeddedDocument<Restaurant>(
"grades",
Builders<Restaurant>.Search.Compound()
.Must(
Builders<Restaurant>.Search.HasRoot(
Builders<Restaurant>.Search.Equals(r => r.Borough, "Manhattan")),
Builders<Restaurant>.Search.Equals("grade", "A"))),
new SearchOptions<Restaurant>
{
IndexName = "restaurantsembedded"
})
.ToList();

Para aprender mais, consulte has-root-ref na documentação do Atlas.

Utilize o método Equals() para verificar se um campo corresponde a um valor especificado.

O exemplo a seguir pesquisa a coleção movies para quaisquer documentos nos quais o valor do campo year é 2000:

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Equals(m => m.Year, 2000))
.ToList();

Para saber mais sobre o operador equals, consulte o guia equals do Atlas.

Use o método Exists() para pesquisar documentos nos quais existe um nome de campo indexado especificado. Se o campo especificado existir, mas não estiver indexado, o documento não será incluído com o conjunto de resultados.

O exemplo a seguir pesquisa a coleção movies para quaisquer documentos nos quais o campo imdb.rating existe. A pesquisa retorna todos os documentos nos quais o campo imdb.rating está presente:

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Exists(m => m.Imdb.Rating))
.ToList();

Para saber mais sobre o operador exists, consulte o guia do Atlas existente.

Use o método Facet() para agrupar resultados por valores ou intervalos nos campos facetados especificados e retornar a contagem para cada um desses grupos.

Você pode usar o método Facet() com os estágios $search e $searchMeta. O MongoDB recomenda usar o faceta com o estágio $searchMeta para recuperar resultados de metadados somente para a query. Para recuperar resultados de metadados e queries usando o estágio $search, use a variável de agregação $$SEARCH_META. Para saber mais sobre essa variável, consulte o guia Atlas de variável de agregação SEARCH_META.

Aplicam-se as seguintes limitações:

  • Você pode executar queries de facets somente em um único campo. Não é possível executar queries de atributos em grupos de campos.

  • Você pode executar queries de faceta em collections fragmentadas em clusters que executam apenas o MongoDB v6.0.

O exemplo a seguir pesquisa a coleção movies em busca de quaisquer documentos nos quais o campo year tenha um valor maior ou igual a 2000. A query usa o método Facet() para processar os documentos de entrada, com um número máximo de 100 categorias de faceta para retornar nos resultados com base no campo genres. A query retorna o número de categorias de gênero distintas encontradas:

var result = moviesCollection.Aggregate()
.SearchMeta(
Builders<Movie>.Search.Facet(
Builders<Movie>.Search.Range(m => m.Year, SearchRangeBuilder.Gte(2000)),
Builders<Movie>.SearchFacet.String("genres", m => m.Genres, 100)),
indexName: "moviesfacetsearch")
.Single()
.Facet["genres"].Buckets.Count();

Para saber mais sobre o coletor facet, consulte o guia do Atlas facet.

Use o método GeoShape() para pesquisar documentos em relação a uma determinada geometria. Ao especificar as coordenadas a serem pesquisadas, a longitude deve ser especificada primeiro e, em seguida, a latitude. Os valores de longitude podem estar entre -180 e 180. Os valores de latitude podem estar entre -90 e 90.

Observação

A Pesquisa do MongoDB não é compatível com o seguinte:

  • Sistema de Referência de Coordenadas Não Padrão (CRS)

  • Sistema de coordenadas Planar XY (bidimensional)

  • Notação de Ponto de pares de coordenadas (pointFieldName: [12, 34])

Este exemplo utiliza a coleção theaters do banco de dados sample_mflix. As seguintes classes modelam os documentos nessa coleção:

[BsonIgnoreExtraElements]
public class Theater
{
[BsonId]
public ObjectId Id { get; set; }
public int TheaterId { get; set; }
public TheaterLocation Location { get; set; } = null!;
}
[BsonIgnoreExtraElements]
public class TheaterLocation
{
[BsonElement("geo")]
public GeoJsonPoint<GeoJson2DGeographicCoordinates> Geo { get; set; } = null!;
}

O exemplo a seguir pesquisa nessa coleção todos os documentos em que as coordenadas no campo location.geo interseccionam com um polígono especificado na área de Minnealis, NV:

GeoJsonPolygon<GeoJson2DGeographicCoordinates> searchArea = new(new(new(new GeoJson2DGeographicCoordinates[]
{
new(-93.5, 44.7),
new(-93.5, 45.0),
new(-93.0, 45.0),
new(-93.0, 44.7),
new(-93.5, 44.7),
})));
var result = theatersCollection.Aggregate()
.Search(Builders<Theater>.Search.GeoShape(
t => t.Location.Geo, GeoShapeRelation.Intersects, searchArea),
indexName: "theatersgeo")
.ToList();

Para saber mais sobre o operador geoShape, consulte o guia geoShape do Atlas.

Use o método GeoWithin() para procurar documentos nos quais as coordenadas de seu campo GeoJSON especificado estão dentro de uma determinada geometria. Você pode pesquisar pontos que estão dentro de:

  • Círculo

  • Caixa delimitadora

  • Polígono

Ao especificar as coordenadas a serem pesquisadas, a longitude deve ser especificada primeiro, seguida da latitude. Os valores de longitude podem estar entre -180 e 180, inclusive. Os valores de latitude podem estar entre -90 e 90, inclusive.

Observação

A Pesquisa do MongoDB não é compatível com o seguinte:

  • Sistema de Referência de Coordenadas Não Padrão (CRS)

  • Sistema de coordenadas Planar XY (bidimensional)

  • Notação de Ponto de pares de coordenadas (pointFieldName: [12, 34])

O exemplo a seguir pesquisa na coleção theaters todos os documentos em que as coordenadas no campo location.geo estejam dentro de um determinado polígono:

GeoJsonPolygon<GeoJson2DGeographicCoordinates> searchArea = new(new(new(new GeoJson2DGeographicCoordinates[]
{
new(-94.0, 44.5),
new(-94.0, 45.2),
new(-92.5, 45.2),
new(-92.5, 44.5),
new(-94.0, 44.5),
})));
var result = theatersCollection.Aggregate()
.Search(Builders<Theater>.Search.GeoWithin(t => t.Location.Geo, searchArea),
indexName: "theatersgeo")
.ToList();

Para saber mais sobre o operador geoWithin , consulte o guia geoWithin Atlas.

Use o método In() para pesquisar documentos com valores de campo que correspondam a uma lista de valores especificados.

O exemplo a seguir pesquisa a coleção movies em busca de documentos que tenham uma array genres que contenha "Action" ou "Comedy":

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.In(m => m.Genres, new[] { "Action", "Comedy" }))
.ToList();

Use o método MoreLikeThis() para pesquisar documentos semelhantes a um documento de entrada.

Este exemplo usa a seguinte classe para especificar o documento de entrada para a pesquisa:

public class MovieSearch
{
public string Plot { get; set; } = null!;
}

O exemplo a seguir pesquisa a coleção movies em busca de documentos semelhantes a um objeto no qual o valor do campo plot é "time travel":

var searchDocument = new MovieSearch()
{
Plot = "time travel",
};
var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.MoreLikeThis(searchDocument))
.ToList();

Para saber mais sobre o operador do moreLikeThis, consulte o guia do Atlas moreLikeThis .

Use o método Near() para pesquisar documentos nos quais um campo especificado está próximo de um determinado valor. Você pode realizar a pesquisa em:

  • Um campo de número

  • Um campo de data

  • Um ponto geográfico

O exemplo a seguir pesquisa a coleção movies em busca de documentos nos quais o valor do campo imdb.rating esteja próximo 8.5. Os documentos são retornados em ordem com base na proximidade do valor de 8.5:

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Near(m => m.Imdb.Rating, 8.5, 1))
.ToList();

To learn more about the near operator, see the near Atlas guide.

Use o método Phrase() para pesquisar documentos nos quais um campo especificado contém uma string de entrada.

O exemplo a seguir pesquisa a coleção movies em busca de documentos nos quais o campo plot contenha a frase "time travel":

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Phrase(m => m.Plot, "time travel"))
.ToList();

Você também pode pesquisar na coleção documentos que contenham "time travel" ou "space adventure" no campo plot :

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Phrase(m => m.Plot, new List<string>() { "time travel", "space adventure" }))
.ToList();

Para saber mais sobre o operador phrase , consulte a frase Guia do Atlas.

Use o método QueryString() para pesquisar documentos usando uma string com os seguintes operadores e delimitadores:

  • AND

  • OR

  • NOT

  • ()

O exemplo a seguir pesquisa na coleção movies documentos nos quais o valor do campo plot corresponda a cada um dos seguintes critérios:

  • Contém a string "time" ou a string "space"

  • Não contém a string "comedy"

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.QueryString(m => m.Plot, "(time OR space) AND NOT comedy"))
.ToList();

Para saber mais sobre o operador queryString, consulte o guia queryString do Atlas.

Use o método Range() para pesquisar documentos nos quais o valor de um campo especificado esteja dentro de um determinado intervalo numérico, de data ou de string.

O exemplo a seguir pesquisa na coleção movies todos os documentos com um valor year maior que 2000 e menor que 2010:

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search
.Range(m => m.Year, SearchRangeBuilder.Gt(2000).Lt(2010)))
.ToList();

To search for documents in which the value of a specified field is within a range of strings, you must first create a token index on the field. After you create the index, you can search for documents based on a range of strings. The following example returns documents in which the title field value falls between "A" and "G", compared in lexicographic order:

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search
.Range(m => m.Title, SearchRangeV2Builder.Gte("A").Lte("G")))
.ToList();

Para saber mais sobre o operador range, consulte o guia Atlas de intervalos.

Use o método Regex() para pesquisar documentos usando uma expressão regular.

O exemplo seguinte pesquisa a coleção movies para documentos em que o valor do campo title contém exatamente seis letras:

var regex = "[A-Za-z]{6}";
var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Regex(m => m.Title, regex,
allowAnalyzedField: true))
.ToList();

Observação

Executando Regex em Campos Analisados

Por padrão, o operador regex não pode ser executado em um campo analisado. Você pode permitir que ele seja executado em um campo analisado definindo a opção allowAnalyzedField como "true", da seguinte forma:

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Regex(m => m.Title, regex,
allowAnalyzedField: true))
.ToList();

Setting the allowAnalyzedField option to true may lead to unexpected search results. To learn more, see Behavior in the Atlas regex guide.

Para saber mais sobre o operador regex , consulte o guia regex Atlas.

Utilize o método Span() para pesquisar correspondências de pesquisa de texto dentro de regiões de um campo. Você pode usar este método para encontrar strings próximas umas das outras com graus de precisão especificados.

Observação

Desempenho do operador de extensão

O operador span é mais intensivo em termos de computação do que os outros operadores porque as queries devem manter o controle das informações de posição.

O exemplo a seguir pesquisa na coleção movies os documentos em que o valor do campo plot contém as strings "time" e "travel" dentro de uma palavra de cada:

var searchTerms = new[]
{
Builders<Movie>.SearchSpan.Term(m => m.Plot, "time"),
Builders<Movie>.SearchSpan.Term(m => m.Plot, "travel")
};
var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Span(Builders<Movie>.SearchSpan.Near(searchTerms, 1)))
.ToList();

Para saber mais sobre o operador span , consulte o guia do Atlas de extensão .

Use o método Text() para fazer uma pesquisa de uma determinada string ou array de strings em um documento. Se houver vários termos em uma determinada string, o MongoDB pesquisa também procurará uma correspondência para cada termo na string separadamente.

O exemplo a seguir pesquisa a coleção movies em busca de documentos nos quais o valor do campo plot contém a string "secret agent":

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Text(m => m.Plot, "secret agent"))
.ToList();

Dica

Comportamento de pesquisa de vários termos

Se a string de pesquisa contiver vários termos, o método também buscará uma correspondência para cada termo na string separadamente.

Para saber mais sobre o operador text, consulte o guia texto do Atlas.

Use o método Wildcard() para pesquisar documentos usando caracteres especiais em sua sequência de pesquisa que podem corresponder a qualquer caractere. Você pode usar os seguintes caracteres em sua pesquisa:

Personagem
Descrição

?

Corresponde a qualquer caractere único

*

Corresponde a 0 ou mais caracteres

\

Caractere de escape

O exemplo a seguir pesquisa documentos nos quais o valor do campo title contém a string "Amer" seguida por qualquer outro caractere:

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Wildcard(m => m.Title, "Amer*", allowAnalyzedField: true))
.ToList();

Observação

Executando Curinga em Campos Analisados

Por padrão, o operador wildcard não pode ser executado em um campo analisado. Você pode permitir que ele seja executado em um campo analisado definindo a opção allowAnalyzedField como "true", da seguinte forma:

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Wildcard(m => m.Title, "Amer*", allowAnalyzedField: true))
.ToList();

Definir a opção allowAnalyzedField como verdadeira pode gerar resultados de pesquisa inesperados. Para saber mais, consulte Comportamento curinga.

Para saber mais sobre o operador wildcard, consulte o guia do Atlas de curingas.

Você pode especificar o caminho para o campo ou campos para pesquisar utilizando a classe SearchPathDefinitionBuilder. Use Builders<TDocument>.SearchPath para acessar uma instância do SearchPathDefinitionBuilder e chame um de seus métodos para especificar o caminho da pesquisa. As seções a seguir descrevem os métodos disponíveis.

Dica

Caminhos de pesquisa

To learn more about search paths, see Construct a Query Path in the Atlas documentation.

Utilize o método Single() para especificar um campo como o caminho da pesquisa. Os exemplos a seguir mostram três maneiras de especificar o campo: usando uma expressão lambda com um modelo digitado, passando um nome de campo de string como uma variável fieldName ou parâmetro de método cujo valor é conhecido no tempo de execução ou usando um documento não digitado .

Observação

The field that you pass to the Single() method must be included in the search index definition. If the field isn't included, MongoDB Server returns an empty result set without returning an error.

Use uma expressão lambda quando estiver trabalhando com um modelo digitado e souber o nome do campo no momento da compilação. Este formulário fornece verificação do tipo em tempo de compilação.

O exemplo a seguir pesquisa no campo plot documentos que contêm o texto "secret agent":

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Text(
Builders<Movie>.SearchPath.Single(m => m.Plot), "secret agent"))
.ToList();

Use um FieldDefinition<TDocument> quando estiver trabalhando com um modelo digitado, mas não souber o nome do campo no momento da compilação. Considere usar este formulário se estiver recuperando o nome do campo da entrada do usuário ou de um arquivo de configuração.

O exemplo a seguir atribui o nome do campo a uma variável FieldDefinition<Movie> e o passa para Single():

FieldDefinition<Movie> runtimeField = fieldName;
var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Text(
Builders<Movie>.SearchPath.Single(runtimeField), "secret agent"))
.ToList();

Você também deve especificar o nome do campo como uma string quando estiver trabalhando com objetos BsonDocument em vez de um modelo digitado.

O exemplo seguinte pesquisa uma coleção não digitada para documentos no campo plot que contêm o texto "secret agent":

var result = moviesCollectionBson.Aggregate()
.Search(Builders<BsonDocument>.Search.Text(
Builders<BsonDocument>.SearchPath.Single("plot"), "secret agent"))
.ToList();

Utilize o método Multi() para especificar o caminho de pesquisa para vários campos. O conjunto de resultados inclui documentos que correspondem a qualquer um dos campos especificados.

Observação

You must include all fields that you pass to the Multi() method in the search index definition. If you pass a field that isn't included, MongoDB Server silently excludes it from the search.

O exemplo a seguir procura a frase "time travel" no campo plot ou title :

var result = moviesCollection.Aggregate().Search(
Builders<Movie>.Search.Phrase(Builders<Movie>.SearchPath
.Multi(m => m.Plot, m => m.Title), "time travel"), indexName: "moviesmulti")
.ToList();

Analyzers process text into searchable tokens by applying operations such as lowercasing. MongoDB Server applies an analyzer when indexing a field and again when running a query against that field. If you specify the multi option when you create a search index, MongoDB Server also stores a second set of tokens produced by an alternate analyzer.

Você pode utilizar o método Analyzer() para executar uma query nos tokens produzidos por um analisador multi em vez dos tokens produzidos pelo analisador padrão do campo. O nome que você passa para Analyzer() deve ser o nome da chave do bloco multi em sua definição de índice, não o nome do analisador subjacente.

O exemplo a seguir usa um analisador multi chamado "lucene" para pesquisar no campo title documentos que contenham o texto "gravity":

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Text(
Builders<Movie>.SearchPath.Analyzer(m => m.Title, "lucene"),
"gravity"), indexName: "moviesanalyzer")
.ToList();

Dica

Analisadores

To learn more about analyzers, see Analyzers in the Atlas documentation.

Utilize o método Wildcard() para especificar um caminho de pesquisa que utiliza caracteres curinga para corresponder aos nomes dos campo . Você pode usar o caractere * no nome do campo para corresponder a qualquer sequência de caracteres.

O MongoDB Server pesquisa apenas campos que atendam às seguintes condições:

  • O campo deve ser indexado.

  • O nome do campo deve corresponder ao padrão especificado.

  • O tipo de dados do campo deve corresponder ao operador de pesquisa. Por exemplo, uma query Text() pesquisa somente campos de string.

O exemplo a seguir pesquisa todos os campos cujos nomes começam com "p" para documentos que contêm o texto "secret agent":

var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Text(
Builders<Movie>.SearchPath.Wildcard("p*"), "secret agent"))
.ToList();

Observação

Wildcard Performance

Padrões amplos, como "*", correspondem a todos os campos indexados e podem afetar o desempenho da query em índices grandes.

To learn more about wildcard paths, see Construct a Query Path in the Atlas documentation.

MongoDB Server assigns a relevance score to every document that it returns from a MongoDB Search query. The query returns the documents in order from highest score to lowest. To learn more about how scores are assigned, see the score Atlas guide.

A pontuação atribuída a um documento retornado faz parte dos metadados do documento. Você pode incluir a pontuação de cada documento retornado junto com o conjunto de resultados usando uma etapa $project em sua agregação pipeline.

O exemplo a seguir pesquisa a coleção movies em busca de documentos nos quais o valor do campo title contém exatamente seis letras e usa um estágio $project para adicionar um campo chamado score aos documentos retornados:

var regex = "[A-Za-z]{6}";
var result = moviesCollection.Aggregate()
.Search(Builders<Movie>.Search.Regex(m => m.Title, regex, allowAnalyzedField: true), indexName: "moviescore")
.Project<Movie>(Builders<Movie>.Projection
.Include(m => m.Id)
.Include(m => m.Title)
.Include(m => m.Plot)
.MetaSearchScore(m => m.Score))
.ToList();

Você pode modificar o comportamento do método Search() passando um objeto SearchOptions como parâmetro.

A classe SearchOptions contém as seguintes propriedades:

Propriedade
Descrição

CountOptions

As opções para contar os resultados da pesquisa.

Data type: SearchCountOptions
Default: null

Highlight

As opções para exibir termos de pesquisa em seu contexto original.

Data type: SearchHighlightOptions<TDocument>
Default: null

IndexName

O índice a ser usado para a pesquisa.

Data type: string
Default: null

ReturnStoredSource

Um sinalizador que especifica se deve ser realizada uma pesquisa completa de documentos no banco de dados ou retornar apenas os campos de origem armazenados diretamente do MongoDB Search.

Data type: boolean
Default: false

ScoreDetails

Um sinalizador que especifica se deve retornar informações detalhadas sobre a pontuação de cada documento nos resultados.

Data type: boolean
Default: false

SearchAfter

O ponto de partida para paginação. Quando definido, a pesquisa recupera documentos começando imediatamente após o ponto de referência especificado.

Data type: string
Default: null

SearchBefore

O ponto final para paginação. Quando definido, a pesquisa recupera documentos iniciando imediatamente antes do ponto de referência especificado.

Data type: string
Default: null

Sort

Os critérios de classificação a serem aplicados aos resultados.

Data type: SortDefinition<TDocument>
Default: null

Tracking

As opções para rastrear termos de pesquisa.

Data type: SearchTrackingOptions
Default: null

O exemplo a seguir pagina os resultados de uma operação MongoDB pesquisa executando as seguintes ações:

  • Define uma projeção que utiliza o método construtor MetaSearchSequenceToken(), que especifica um PaginationToken para conter o ponto de referência

  • Cria uma instância SearchOptions e define o índice e os critérios de classificação a serem utilizados.

  • Executa uma pesquisa inicial para encontrar documentos que possuam um valor no campo plot que contenha o texto "time travel", aplicando a projeção e as opções à operação

  • Configura a propriedade SearchAfter da mesma instância SearchOptions para instruir a próxima pesquisa a iniciar após o primeiro resultado da pesquisa base

  • Executa outra operação de pesquisa que possui os mesmos critérios de correspondência e aplica as opções de pesquisa para paginar os resultados

var projection = Builders<Movie>.Projection
.Include(x => x.Title)
.MetaSearchSequenceToken(x => x.PaginationToken);
var searchDefinition = Builders<Movie>.Search.Text(m => m.Plot, "time travel");
var searchOptions = new SearchOptions<Movie>
{ IndexName = "default", Sort = Builders<Movie>.Sort.Ascending(m => m.Id) };
// Runs the base search operation
var baseSearchResults = moviesCollection.Aggregate()
.Search(searchDefinition, searchOptions)
.Project<Movie>(projection)
.ToList();
if (baseSearchResults.Count == 0)
return baseSearchResults;
// Sets the starting point for the next search
searchOptions.SearchAfter = baseSearchResults[0].PaginationToken;
var result = moviesCollection.Aggregate()
.Search(searchDefinition, searchOptions)
.Project<Movie>(projection)
.ToList();

Dica

Documentação de paginação

Para saber mais sobre a paginação do MongoDB pesquisa, consulte Paginar os Resultados na documentação do Atlas.