Overview
La función de búsqueda de MongoDB permite realizar búsquedas de texto completo en colecciones alojadas en Atlas. Antes de realizar consultas de búsqueda de MongoDB, debe crear índices que especifiquen qué campos indexar y cómo hacerlo.
Para obtener más información sobre MongoDB Search, consulte Descripción general de la búsqueda de MongoDB en la documentación de Búsqueda de MongoDB.
Datos de muestra
Los ejemplos de esta guía utilizan el movies Colección en la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte la guía de introducción de MongoDB.
Para administrar los índices de búsqueda de MongoDB en la colección sample_mflix desde su aplicación C++, primero cree una instancia de mongocxx::client que se conecte a un clúster Atlas y asigne los siguientes valores a sus variables db y collection:
auto db = client["sample_mflix"]; auto collection = db["movies"];
Luego, llama al método search_indexes() en tu variable collection para instanciar un mongocxx::search_index_view en tu colección:
auto siv = collection.search_indexes();
La clase mongocxx::search_index_view contiene las siguientes funciones miembro que le permiten interactuar con los índices de búsqueda de MongoDB:
create_one(): crea un índice de búsqueda de MongoDB con la configuración especificada
create_many(): crea múltiples índices de búsqueda de MongoDB con las configuraciones especificadas
list(): Devuelve una
mongocxx::cursorinstancia que apunta a una lista de índices de búsqueda de MongoDB en la colecciónupdate_one(): Actualiza la definición del índice de búsqueda de MongoDB especificado
drop_one(): elimina el índice especificado de la colección
Nota
La gestión del índice de búsqueda de MongoDB es asincrónica
El driver de C++ de MongoDB gestiona los índices MongoDB Search de forma asíncrona. Los métodos de la librería descritos en las siguientes secciones devuelven inmediatamente la respuesta del servidor, pero los cambios en sus índices de MongoDB Search se realizan en segundo plano y podrían no completarse hasta algún tiempo después.
Las siguientes secciones proporcionan ejemplos de código que demuestran cómo utilizar cada método de administración de índice de búsqueda de MongoDB.
Cree un índice de búsqueda de MongoDB
Para crear un único índice de búsqueda de MongoDB en una colección, llame al método create_one() en una instancia mongocxx::search_index_view y pase una instancia mongoxcc::search_index_model especificando el índice que desea crear.
El constructor mongocxx::search_index_model requiere los siguientes argumentos:
name: String que especifica el nombre del índicedefinition:Documento que contiene el campomappings, que especifica cómo configurar los campos en su índice
Tip
Para obtener una lista completa de los campos que puede configurar en un índice de búsqueda de MongoDB, consulte la guía Revisar la sintaxis del índice de búsqueda de MongoDB en la documentación de Búsqueda de MongoDB.
Las siguientes secciones muestran cómo crear un único índice de búsqueda de MongoDB que utiliza asignaciones estáticas o dinámicas.
Crear un índice de búsqueda de MongoDB con asignaciones estáticas
Utilice asignaciones estáticas en su índice de búsqueda de MongoDB para especificar los campos que desea indexar y configurar opciones de índice para campos individuales.
Para crear un único índice de búsqueda de MongoDB que utilice asignaciones estáticas, primero cree un documento definition que contenga el campo mappings. En el campo mappings, especifique un documento que contenga los siguientes campos y valores:
dynamic:Establecer enfalse.fields: Documento que especifica los nombres de los campos que desea indexar y sus configuraciones de índice. Para obtener más información sobre lasmappings.fieldsopciones, consulte el ejemplo de mapeo estático en la documentación de MongoDB Search.
Luego, pase una cadena name y el documento definition a un constructor mongocxx::search_index_model para instanciar un mongocxx::search_index_model. Pase esta instancia mongocxx::search_index_model al método create_one() para agregar el índice de búsqueda de MongoDB especificado a su colección.
El siguiente ejemplo muestra cómo crear un único índice de búsqueda de MongoDB que usa asignaciones estáticas:
// 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
No puedes indexar campos que contengan el signo de dólar ($) al inicio del nombre del campo.
Para obtener más información sobre cuándo utilizar asignaciones estáticas, consulte la sección Asignaciones estáticas en la documentación de Búsqueda de MongoDB.
Crear un índice de búsqueda de MongoDB con asignaciones dinámicas
Utilice asignaciones dinámicas en su índice de MongoDB Search para indexar automáticamente todos los campos de los tipos admitidos. Para obtener una lista de los tipos de datos BSON admitidos, consulte la sección "Tipos de datos" en la documentación de MongoDB Search.
Para crear un único índice de búsqueda de MongoDB que utilice asignaciones dinámicas, primero cree un documento definition que contenga el campo mappings. En el campo mappings, especifique un documento que contenga el campo dynamic con su valor true. A continuación, pase una cadena name y el documento definition a un constructor mongocxx::search_index_model para instanciar un mongocxx::search_index_model. Pase esta instancia mongocxx::search_index_model al método create_one() para añadir el índice de búsqueda de MongoDB especificado a su colección.
El siguiente ejemplo muestra cómo crear un único índice de búsqueda de MongoDB que utiliza asignaciones dinámicas:
// 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 obtener más información sobre cuándo utilizar asignaciones dinámicas, consulte la sección Asignaciones dinámicas en la documentación de Búsqueda de MongoDB.
Crear múltiples índices de búsqueda de MongoDB
Para crear múltiples índices de búsqueda de MongoDB, llame al método create_many() en una instancia mongocxx::search_index_view y pase un vector de mongocxx::search_index_model instancias que especifiquen los índices de búsqueda de MongoDB que desea crear.
El siguiente ejemplo muestra cómo crear múltiples índices de búsqueda de 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
Lista de índices de búsqueda de MongoDB
Para listar los índices de búsqueda de MongoDB en una colección, llame al método list() en una instancia mongocxx::search_index_view. Este método devuelve una instancia mongocxx::cursor que puede usar para iterar sobre los índices de búsqueda de MongoDB de la colección.
El siguiente ejemplo imprime una lista de índices de búsqueda de MongoDB iterando sobre una cursor::iterator instancia que apunta a los índices de Crear múltiples índices de búsqueda de 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, puede listar un índice de búsqueda de MongoDB específico pasando el nombre del índice al método list(). Esto devuelve una instancia mongocxx::cursor que apunta a un conjunto de resultados que contiene únicamente el índice especificado.
El siguiente ejemplo utiliza el método list() para imprimir un índice con el nombre 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 } }, ...}
Actualizar un índice de búsqueda de MongoDB
Para actualizar un índice de búsqueda de MongoDB, llame al método update_one() en una instancia mongocxx::search_index_view y pase el nombre del índice que desea actualizar y la definición a la que actualizar el índice.
El siguiente ejemplo muestra cómo actualizar el índice de búsqueda de MongoDB desde Crear un índice de búsqueda con asignaciones estáticas para usar un analizador simple en el 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());
Eliminar un índice de búsqueda de MongoDB
Para eliminar un índice de búsqueda de MongoDB de una colección, llame al método drop_one() en una instancia mongocxx::search_index_view y pase el nombre del índice que desea eliminar.
El siguiente ejemplo muestra cómo eliminar un índice de búsqueda de MongoDB llamado myDynamicIndex:
siv.drop_one("myDynamicIndex");
Información Adicional
Para ver ejemplos ejecutables que demuestran cómo administrar índices, consulte Optimizar consultas con índices.
Para obtener guías más detalladas sobre cómo utilizar la función de búsqueda de MongoDB y definir índices de búsqueda de MongoDB, consulte las siguientes páginas de documentación de búsqueda de MongoDB:
Documentación de la API
Para obtener más información sobre los métodos analizados en esta guía, consulte la siguiente documentación de API: