Overview
En esta guía, puede aprender a usar el controlador Rust para ejecutar MongoDB Search consultas de búsqueda en una colección. MongoDB Search permite realizar búsquedas de texto completo en colecciones alojadas en MongoDB Atlas. Los índices de MongoDB Search especifican el comportamiento de la búsqueda y los campos que se van a indexar.
Datos de muestra
El ejemplo de esta guía utiliza 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, consulta la guía Empieza con Atlas.
Ejecuta una MongoDB Search query
Esta sección muestra cómo crear una pipeline de agregación para ejecutar una MongoDB Search query en una colección.
Para ejecutar una consulta de búsqueda de MongoDB, debe crear un índice de búsqueda de MongoDB en su colección. Para aprender a crear un índice de búsqueda de MongoDB mediante programación, consulte
MongoDB Search and Vector Search Indexes sección de la guía de Índices. Puede reemplazar el marcador de posición <search index name> en los ejemplos de código de esta guía con el nombre de su índice MongoDB Search.
Tras crear un índice de MongoDB Search, añade la etapa $search en tu arreglo de etapas de la pipeline para especificar los criterios de búsqueda. Luego, llama al método aggregate() y pasa el arreglo del pipeline como parámetro.
Tip
Para obtener más información sobre las operaciones de agregación, consulta la guía de Agregación.
MongoDB Search Ejemplo
Este ejemplo ejecuta una MongoDB Search al realizar las siguientes acciones:
Crea una etapa
$searchque indica al controlador que consulte documentos en los que el campotitlecontiene la palabra"Alabama"Crea una etapa
$projectque instruya al driver para incluir el campotitleen los resultados de la query.Pasa las etapas de la pipeline al método
aggregate()e imprime los resultados
use mongodb::{ bson::{doc, Document}, Client, Collection, }; use futures::stream::TryStreamExt; async fn main() -> mongodb::error::Result<()> { // Replace the uri string with your connection string let uri = "<connection string uri>"; let client = Client::with_uri_str(uri).await?; let my_coll: Collection<Document> = client .database("sample_mflix") .collection("movies"); // Defines the MongoDB Search query let pipeline = vec![ doc! { "$search": { "index": "<search index name>", "text": { "query": "Alabama", "path": "title" } } }, doc! { "$project": { "title": 1, "_id": 1 } } ]; // Runs the aggregation pipeline let mut cursor = my_coll.aggregate(pipeline).await?; // Prints the results while let Some(doc) = cursor.try_next().await? { println!("{}", doc); } Ok(()) }
{ "_id": ObjectId("..."), "title": "Alabama Moon" } { "_id": ObjectId("..."), "title": "Crazy in Alabama" } { "_id": ObjectId("..."), "title": "Sweet Home Alabama" }
MongoDB Search metadatos
Utiliza la etapa $searchMeta de la pipeline para crear una etapa de agregación $searchMeta, que devuelve solo los metadatos de los resultados de MongoDB Search.
Tip
Solo disponible en Atlas para MongoDB v4.4.11 y posteriores
Este operador de canalización de agregación solo está disponible en clústeres MongoDB Atlas que ejecutan v4.4.11 y versiones posteriores.
El siguiente ejemplo muestra cómo recuperar metadatos para una etapa de agregación de MongoDB Search:
use mongodb::{ bson::{doc, Document, DateTime}, Client, Collection, }; use futures::stream::TryStreamExt; async fn main() -> mongodb::error::Result<()> { // Replace the uri string with your connection string let uri = "<connection string uri>"; let client = Client::with_uri_str(uri).await?; let my_coll: Collection<Document> = client .database("sample_mflix") .collection("movies"); // Defines the $searchMeta pipeline stage let pipeline = vec![ doc! { "$searchMeta": { "index": "<search index name>", "near": { "path": "released", "origin": DateTime::parse_rfc3339_str("2011-09-01T00:00:00.000Z") .unwrap(), "pivot": 7776000000i64 } } } ]; let mut cursor = my_coll.aggregate(pipeline).await?; while let Some(doc) = cursor.try_next().await? { println!("{}", doc); } Ok(()) }
{ "count": 3, "hits": [ { "id": ObjectId("..."), "score": 1.0 }, { "id": ObjectId("..."), "score": 1.0 }, { "id": ObjectId("..."), "score": 1.0 } ] }
Crear etapas de búsqueda en pipeline
El controlador de MongoDB para Rust proporciona métodos auxiliares y constructores para crear etapas de la canalización de búsqueda de MongoDB. Estos ayudantes permiten construir consultas de búsqueda complejas utilizando el sistema de tipos de Rust para una mayor seguridad en tiempo de compilación.
MongoDB Search Operadores
El controlador de Rust admite los siguientes operadores de búsqueda de MongoDB mediante la construcción de documentos BSON:
Operador | Descripción |
|---|---|
Realiza una búsqueda de una palabra o frase que contenga una secuencia de caracteres de una cadena de entrada incompleta. | |
Combina dos o más operadores en una única query. | |
Verifica si un campo coincide con un valor que especificas. | |
Comprueba si existe una ruta a un nombre de campo indexado específico en un documento. | |
Para consultas geográficas que permiten la búsqueda por ubicación. | |
Devolver los fragmentos de texto que coincidan con los criterios de búsqueda, útil para interfaces de usuario que necesitan resaltar términos de búsqueda. | |
Realiza una búsqueda de un arreglo de valores de número, fecha, booleano, objectId, uuid o string BSON en la ruta determinada y retorna documentos donde el valor del campo coincide con cualquier valor en el arreglo especificado. | |
Devuelve documentos similares a los documentos de entrada. | |
Permite consultar y puntuar valores numéricos, fechas y valores de puntos GeoJSON. | |
Realiza una búsqueda de documentos que contienen una secuencia ordenada de términos utilizando el analizador especificado en la configuración del índice. | |
Brinda soporte a las queries de una combinación de campos indexados y valores. | |
Admite consultas y puntuaciones de valores numéricos, de fecha y de string. | |
Interpreta el campo de query como una expresión regular. | |
Realiza una búsqueda de texto completo utilizando el analizador que especifique en la configuración del índice. | |
Permite consultas que utilizan caracteres especiales en la cadena de búsqueda que pueden coincidir con cualquier carácter. |
Ejemplo de etapa de búsqueda en el pipeline
Nota
Conjunto de datos de muestra de Atlas
Este ejemplo utiliza la colección sample_mflix.movies de los conjuntos de datos de muestra de Atlas. Para aprender cómo configurar un clúster de Atlas de nivel gratuito y cargar el conjunto de datos de muestra, consulta el tutorial Empezar con Atlas en la documentación de Atlas.
Antes de poder ejecutar este ejemplo, debes crear un índice de Búsqueda de MongoDB en la colección movies que tenga la siguiente definición:
{ "mappings": { "dynamic": true, "fields": { "title": { "analyzer": "lucene.keyword", "type": "string" }, "genres": { "normalizer": "lowercase", "type": "token" } } } }
Para obtener más información sobre la creación de índices de búsqueda de MongoDB, consulte la sección Índices de búsqueda de MongoDB y de búsqueda vectorial de la guía Índices.
Puede reemplazar el marcador de posición <search index name> en el código con el nombre de su índice de búsqueda de MongoDB.
El siguiente código crea un escenario $search que tiene las siguientes especificaciones:
Comprueba que el arreglo
genresincluya"Comedy"Busca en el campo
fullplotla frase"new york"Coincide con
yearvalores entre1950y2000, ambos inclusiveBusca
titlevalores que comiencen con el término"Love"
use mongodb::{ bson::{doc, Document}, Client, Collection, }; use futures::stream::TryStreamExt; async fn main() -> mongodb::error::Result<()> { // Replace the uri string with your connection string let uri = "<connection string uri>"; let client = Client::with_uri_str(uri).await?; let my_coll: Collection<Document> = client .database("sample_mflix") .collection("movies"); // Creates a complex search using multiple operators let search_stage = doc! { "$search": { "index": "<search index name>", "compound": { "must": [ { "equals": { "path": "genres", "value": "Comedy" } }, { "phrase": { "path": "fullplot", "query": "new york" } }, { "range": { "path": "year", "gte": 1950, "lte": 2000 } }, { "wildcard": { "path": "title", "query": "Love*" } } ] } } }; let project_stage = doc! { "$project": { "title": 1, "year": 1, "genres": 1, "_id": 1 } }; let pipeline = vec![search_stage, project_stage]; let mut cursor = my_coll.aggregate(pipeline).await?; while let Some(doc) = cursor.try_next().await? { println!("{}", doc); } Ok(()) }
{ "_id": ObjectId("..."), "genres": ["Comedy", "Romance"], "title": "Love at First Bite", "year": 1979 } { "_id": ObjectId("..."), "genres": ["Comedy", "Drama"], "title": "Love Affair", "year": 1994 }
Para saber más sobre los operadores de MongoDB Search, consulta la documentación de Operadores de MongoDB Search.
Construcción de query tipo segura
El MongoDB Rust Driver proporciona métodos auxiliares type-safe para crear consultas de MongoDB Search. Estos asistentes utilizan el sistema de tipos de Rust para proporcionar validación en tiempo de compilación y un mejor soporte para el IDE en comparación con la construcción de documentos BSON en bruto.
El siguiente ejemplo construye una consulta de autocompletar con seguridad de tipo utilizando el módulo atlas_search:
use mongodb::atlas_search; let cursor = collection.aggregate(vec![ atlas_search::autocomplete("title", "pre") .fuzzy(doc! { "maxEdits": 1, "prefixLength": 1, "maxExpansions": 256 }) .into_stage(), doc! { "$limit": 10, }, doc! { "$project": { "_id": 0, "title": 1, } }, ]).await?;
La consulta del ejemplo anterior realiza las siguientes operaciones:
Utiliza el método
autocomplete()para buscar títulos que comiencen con"pre"Se utiliza el método
fuzzy()para añadir tolerancia a errores tipográficos con parámetros específicos:maxEditsEstablece el número máximo de cambios de caracteres permitidos en1prefixLengthConjunto: Establece el número de caracteres al principio que deben coincidir exactamente con1maxExpansionsEstablece el número máximo de variaciones a considerar para256
Utiliza el método
into_stage()para generar el documento BSON$searchadecuadoLimita la salida a
10documentosDevuelve solo el campo
title, excluyendo_id
Información Adicional
Para obtener más información sobre MongoDB Search, consulte la MongoDB Search en la documentación de Atlas.
Documentación de la API
Para obtener más información sobre los métodos mencionados en esta guía, consulte la siguiente documentación de API: