Visão geral
O recurso MongoDB Pesquisa permite realizar pesquisas de texto completo em coleções hospedadas no Atlas. Antes de executar queries de pesquisa no MongoDB Search, você deve criar índices que especifiquem quais campos indexar e como serão indexados.
Para saber mais sobre o MongoDB pesquisa, veja o Visão geral do MongoDB pesquisa na documentação do MongoDB pesquisa.
Dados de amostra
Os exemplos deste guia usam a coleção movies no banco de dados sample_mflix dos conjuntos 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 MongoDB Get Started.
Para gerenciar índices de pesquisa do MongoDB na coleção sample_mflix a partir do seu aplicativo C++, primeiro instancie um mongocxx::client que se conecte a um cluster Atlas 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 nó que permitem a você a interação com índices de pesquisa MongoDB:
create_one(): Cria um índice de Pesquisa MongoDB com a configuração especificada
create_many(): Cria vários índices de pesquisa do MongoDB com as configurações especificadas
list(): Retorna uma instância
mongocxx::cursorque aponta para uma lista de índices de pesquisa do MongoDB 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 de pesquisa do MongoDB 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 do índice de pesquisa MongoDB.
Crie um índice de pesquisa do MongoDB
Para criar um único índice de pesquisa do MongoDB Search em uma coleção, 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 de pesquisa do MongoDB, consulte o guia Revisar Sintaxe do índice de pesquisa do MongoDB na documentação do MongoDB Search.
As seções a seguir mostram como criar um único índice de pesquisa do MongoDB 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 de pesquisa MongoDB 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 as opções domappings.fields, consulte o Exemplo de mapeamento estático na documentação do MongoDB pesquisa.
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 de pesquisa MongoDB 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 pesquisa.
Crie um índice de pesquisa do MongoDB com mapeamentos dinâmicos
Use mapeamentos dinâmicos em seu índice de pesquisa MongoDB para indexar automaticamente todos os campos dos tipos suportados. Para uma lista dos tipos de dados BSON compatíveis, consulte a seção Tipos de dados na documentação do MongoDB pesquisa.
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 de pesquisa 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 pesquisa.
Crie vários índices de pesquisa do MongoDB
Para criar vários índices de pesquisa do MongoDB, 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 de pesquisa do MongoDB que você deseja criar.
O exemplo a seguir mostra como criar vários índices de pesquisa do MongoDB:
// 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 de pesquisa do MongoDB iterando sobre uma instância cursor::iterator que aponta para os índices de Criar vários índices de pesquisa do MongoDB:
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 de pesquisa específico do MongoDB 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 de pesquisa do MongoDB, 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 de pesquisa do MongoDB Search de Criar um índice de pesquisa com mapeamentos estáticos para usar um analisador simples no campo title:
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 de pesquisa do MongoDB 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 de pesquisa do MongoDB 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 Pesquisa e definir índices de pesquisa, consulte as seguintes páginas de documentação do MongoDB Pesquisa:
Documentação da API
Para saber mais sobre os métodos discutidos neste guia, consulte a seguinte documentação da API: