Overview
En esta guía, puede aprender a usar el controlador Rust para ejecutar Consultas deMongoDB Search 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 indexan.
Datos de muestra
El ejemplo de esta guía utiliza el movies Colección en la sample_mflix base de datos 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 "Comenzar con Atlas".
Ejecutar una consulta de búsqueda de MongoDB
Esta sección muestra cómo crear una canalización de agregación para ejecutar una consulta de búsqueda de MongoDB 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
Sección de índices de búsqueda MongoDB y búsqueda vectorial de la guía de índices. Puede reemplazar el <search index name> marcador en los ejemplos de código de esta guía con el nombre de su índice de búsqueda MongoDB.
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
Ejemplo de búsqueda en MongoDB
Este ejemplo ejecuta una consulta de búsqueda de MongoDB realizando 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 indica al controlador que incluya el campotitleen los resultados de la consultaPasa las etapas de la canalización 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" }
Metadatos de búsqueda de MongoDB
Utilice la $searchMeta etapa de canalización para crear una etapa de agregación $searchMeta, que devuelve solo los metadatos de los resultados de búsqueda de MongoDB.
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 búsqueda de MongoDB:
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 de canalización
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.
Operadores de búsqueda de MongoDB
El controlador Rust admite los siguientes operadores de búsqueda de MongoDB a través de 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 sola consulta. | |
Comprueba si un campo coincide con un valor especificado. | |
Comprueba si existe una ruta a un nombre de campo indexado específico en un documento. | |
Para consultas geográficas que permiten buscar por ubicación. | |
Para devolver los fragmentos de texto que coinciden con los criterios de búsqueda, útil para interfaces de usuario que necesitan resaltar los términos de búsqueda. | |
Realiza una búsqueda de una matriz de valores BSON de número, fecha, booleano, objectId, uuid o cadena en la ruta indicada y devuelve documentos donde el valor del campo es igual a cualquier valor en la matriz especificada. | |
Devuelve documentos similares a los documentos de entrada. | |
Admite la consulta y puntuación de valores numéricos, de fecha y 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 la consulta y puntuación de valores numéricos, de fecha y de cadena. | |
Interpreta el campo de consulta 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 del 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, debe 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 una etapa $search que tiene las siguientes especificaciones:
Comprueba que la matriz
genresincluye"Comedy"Busca en el campo
fullplotla frase"new york"Coincide con
yearvalores entre1950y2000, 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 obtener más información sobre los operadores de búsqueda de MongoDB, consulte la documentación de Operadores de búsqueda de MongoDB.
Construcción de query tipo segura
El controlador de MongoDB para Rust proporciona métodos auxiliares con seguridad de tipos para construir consultas de búsqueda de MongoDB. Estos auxiliares utilizan el sistema de tipos de Rust para proporcionar validación en tiempo de compilación y una mejor compatibilidad con IDE en comparación con la construcción de documentos BSON sin formato.
El siguiente ejemplo crea 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:maxEdits:Establece el número máximo de cambios de caracteres permitidos.1prefixLength:Establece el número de caracteres al principio que deben coincidir exactamente con1maxExpansions:Establece el número máximo de variaciones a considerar256
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 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: