Visão geral
O recurso MongoDB Search permite realizar pesquisas de texto completo em collections hospedadas no Atlas. Antes de executar queries no MongoDB Search, você deve criar índices que especifiquem quais campos indexar e como serão indexados.
Para saber mais sobre o MongoDB Search, consulte a Visão Geral do MongoDB Search na documentação do MongoDB Search.
Dados de amostra
Os exemplos neste guia utilizam a coleção movies
no banco de dados do sample_mflix
a partir dos conjuntos de banco de dados de amostra do Atlas. Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o guia Iniciar com Atlas .
Para gerenciar índices do MongoDB Search na coleção sample_mflix
a partir do seu aplicação C++ , primeiro instancie um mongocxx::client
que se conecte a um Atlas cluster e atribua os seguintes valores às suas variáveis db
e collection
:
auto db = client["sample_mflix"]; auto collection = db["movies"];
Em seguida, chame o método search_indexes()
em sua variável collection
para instanciar um mongocxx::search_index_view
em sua coleção:
auto siv = collection.search_indexes();
A classe mongocxx::search_index_view
contém as seguintes funções de membro que permitem a você interagir com índices de pesquisa MongoDB :
create_one(): Cria um índice de Pesquisa MongoDB com a configuração especificada
create_many(): Cria vários índices do MongoDB Search com as configurações especificadas
list(): Retorna uma
mongocxx::cursor
instância que aponta para uma lista de índices do MongoDB Search na coleçãoupdate_one(): Atualiza a definição do índice de pesquisa MongoDB especificado
drop_one(): Remove o índice especificado da coleção
Observação
O gerenciamento do índice de pesquisa do MongoDB é assíncrono
O driver C++ do MongoDB gerencia índices de pesquisa do MongoDB de forma assíncrona. Os métodos da biblioteca descritos nas seções a seguir retornam a resposta do servidor imediatamente, mas as alterações nos índices do MongoDB Search ocorrem em segundo plano e podem não ser concluídas até algum tempo depois.
As seções a seguir fornecem exemplos de código que demonstram como usar cada método de gerenciamento de índice do MongoDB Search.
Crie um índice de pesquisa do MongoDB
Para criar um único índice do MongoDB Search em uma collection, chame o método create_one()
em uma instância mongocxx::search_index_view
e passe uma instância mongoxcc::search_index_model
especificando o índice que você deseja criar.
O construtor mongocxx::search_index_model
exige os seguintes argumentos:
name
: string especificando o nome do seu índicedefinition
: Documento contendo o campomappings
, que especifica como configurar campos em seu índice
Dica
Para obter uma lista completa de campos que você pode configurar em um índice do MongoDB Search, consulte o guia Revisar a sintaxe do índice do MongoDB Search na documentação do MongoDB Search.
As seções a seguir mostram como criar um único índice do MongoDB Search que usa mapeamentos estáticos ou dinâmicos.
Crie um índice de pesquisa do MongoDB com mapeamentos estáticos
Use mapeamentos estáticos em seu índice do MongoDB Search para especificar os campos que você deseja indexar e configurar opções de índice para campos individuais.
Para criar um único índice de pesquisa do MongoDB que use mapeamentos estáticos, primeiro crie um documento definition
contendo o campo mappings
. No campo mappings
, especifique um documento contendo os seguintes campos e valores:
dynamic
: Defina comofalse
.fields
: Documento que especifica os nomes dos campos que você deseja indexar e suas configurações de índice. Para saber mais sobre asmappings.fields
opções do, consulte o Exemplo de mapeamento estático na documentação do MongoDB Search.
Em seguida, passe uma string name
e o documento definition
para um construtor mongocxx::search_index_model
para instanciar um mongocxx::search_index_model
. Passe esta instância mongocxx::search_index_model
para o método create_one()
para adicionar o índice de pesquisa MongoDB especificado à sua coleção.
O exemplo a seguir mostra como criar um único índice do MongoDB Search que usa mapeamentos estáticos:
// Create an index model with your index name and definition containing the fields you want to index auto name = "myStaticIndex"; auto fields = make_document(kvp("title", make_document(kvp("type", "string"), kvp("analyzer","lucene.standard"))), kvp("year", make_document(kvp("type","number")))); auto definition = make_document(kvp("mappings", make_document(kvp("dynamic", false), kvp("fields", fields)))); auto model = mongocxx::search_index_model(name, definition.view()); // Create the search index auto result = siv.create_one(model); std::cout << "New index name: " << result << std::endl;
New index name: myStaticIndex
Importante
Você não pode indexar campos que contêm o sinal de dólar ($
) no início do nome do campo.
Para saber mais sobre quando usar mapeamentos estáticos, consulte a seção Mapeamentos estáticos na documentação do MongoDB Search.
Crie um índice de pesquisa do MongoDB com mapeamentos dinâmicos
Use mapeamentos dinâmicos em seu índice do MongoDB Search para indexar automaticamente todos os campos dos tipos suportados. Para obter uma lista dos tipos de dados BSON compatíveis, consulte a seção Tipos de dados na documentação do MongoDB Search.
Para criar um único índice de pesquisa do MongoDB que use mapeamentos dinâmicos, primeiro crie um documento definition
contendo o campo mappings
. No campo mappings
, especifique um documento contendo o campo dynamic
com seu valor definido como true
. Em seguida, passe uma string name
e o documento definition
para um construtor mongocxx::search_index_model
para instanciar um mongocxx::search_index_model
. Passe esta instância mongocxx::search_index_model
para o método create_one()
para adicionar o índice de pesquisa MongoDB especificado à sua coleção.
O exemplo a seguir mostra como criar um único índice do MongoDB Search que usa mapeamentos dinâmicos:
// Create an index model with your index name and definition auto name = "myDynamicIndex"; auto definition = make_document(kvp("mappings", make_document(kvp("dynamic", true)))); auto model = mongocxx::search_index_model(name, definition.view()); // Create the search index auto result = siv.create_one(model); std::cout << "New index name: " << result << std::endl;
New index name: myDynamicIndex
Para saber mais sobre quando usar mapeamentos dinâmicos, consulte a seção Mapeamentos dinâmicos na documentação do MongoDB Search.
Crie vários índices de pesquisa do MongoDB
Para criar vários índices do MongoDB Search, chame o método create_many()
em uma instância mongocxx::search_index_view
e passe um vetor de instâncias mongocxx::search_index_model
especificando os índices do MongoDB Search que você deseja criar.
O exemplo a seguir mostra como criar vários índices do MongoDB Search:
// Create a vector to store Search index models std::vector<mongocxx::search_index_model> models; // Add an index model with dynamic mappings to the input vector auto name_1 = "myDynamicIndex"; auto definition_1 = make_document(kvp("mappings", make_document(kvp("dynamic", true)))); auto model_1 = mongocxx::search_index_model(name_1, definition_1.view()); models.push_back(model_1); // Add an index model with static mappings to the input vector auto name_2 = "myStaticIndex"; auto fields = make_document(kvp("title", make_document(kvp("type", "string"), kvp("analyzer","lucene.standard"))), kvp("year", make_document(kvp("type","number")))); auto definition_2 = make_document(kvp("mappings", make_document(kvp("dynamic", false), kvp("fields", fields)))); auto model_2 = mongocxx::search_index_model(name_2, definition_2.view()); models.push_back(model_2); // Create the search indexes auto result = siv.create_many(models); // Print the search index names std::cout << "New index names:" << std::endl; for (const std::string& name : result) { std::cout << name << std::endl; }
New index names: myDynamicIndex myStaticIndex
Listar índices de pesquisa do MongoDB
Para listar os índices de pesquisa do MongoDB em uma coleção, chame o método list()
em uma instância mongocxx::search_index_view
. Esse método retorna uma instância do mongocxx::cursor
que você pode utilizar para iterar sobre os índices de pesquisa MongoDB da coleção.
O exemplo a seguir imprime uma lista de índices do MongoDB Search iterando sobre uma cursor::iterator
instância que aponta para os índices de Criar vários índices do MongoDB Search:
auto cursor = siv.list(); for (mongocxx::cursor::iterator it = cursor.begin(); it != cursor.end(); ++it) { std::cout << bsoncxx::to_json(*it) << std::endl; }
{ "id" : ..., "name" : "myDynamicIndex", "type" : "search", ..., "latestDefinition" : { "mappings" : { "dynamic" : true } }, ...} { "id" : ..., "name" : "myStaticIndex", "type" : "search", ..., "latestDefinition" : { "mappings" : { "dynamic" : false, "fields" : { "title" : { "type" : "string", "analyzer" : "lucene.standard" }, "year" : { "type" : "number" } } } }, ...}
Como alternativa, você pode listar um índice específico do MongoDB Search passando um nome de índice para o método list()
. Isso retorna uma instância mongocxx::cursor
que aponta para um conjunto de resultados que contém somente o índice especificado.
O exemplo seguinte utiliza o método list()
para imprimir um índice com o nome myDynamicIndex
:
auto cursor = siv.list("myDynamicIndex"); for (mongocxx::cursor::iterator it = cursor.begin(); it != cursor.end(); ++it) { std::cout << bsoncxx::to_json(*it) << std::endl; }
{ "id" : ..., "name" : "myDynamicIndex", "type" : "search", ..., "latestDefinition" : { "mappings" : { "dynamic" : true } }, ...}
Atualizar um índice de pesquisa MongoDB
Para atualizar um índice do MongoDB Search, chame o método update_one()
em uma instância do mongocxx::search_index_view
e passe o nome do índice que você deseja atualizar e a definição para a qual atualizar o índice.
O exemplo a seguir mostra como atualizar o índice do MongoDB Search de Criar um índice de pesquisa com mapeamentos estáticos para usar um analisador simples no title
campo :
auto update_fields = make_document(kvp("title", make_document(kvp("type", "string"), kvp("analyzer","lucene.simple"))), kvp("year", make_document(kvp("type","number")))); auto update_definition = make_document(kvp("mappings", make_document(kvp("dynamic", false), kvp("fields", update_fields)))); siv.update_one("myStaticIndex", update_definition.view());
Remover um índice de pesquisa MongoDB
Para remover um índice do MongoDB Search de uma coleção, chame o método drop_one()
em uma instância mongocxx::search_index_view
e passe o nome do índice que você deseja remover.
O exemplo a seguir mostra como remover um índice do MongoDB Search chamado myDynamicIndex
:
siv.drop_one("myDynamicIndex");
Informações adicionais
Para ver exemplos executáveis que demonstram como gerenciar índices, consulte Otimizar Queries com Índices.
Para obter guias mais detalhados sobre como usar o recurso MongoDB Search e definir índices de MongoDB Search, consulte as seguintes páginas de documentação do MongoDB Search:
Documentação da API
Para saber mais sobre os métodos discutidos neste guia, consulte a seguinte documentação da API: