Overview
En esta guía, aprenderá a usar intercalaciones para ordenar los resultados de búsquedas o agregaciones por valores de cadena. Una intercalación es un conjunto de convenciones de ordenación de caracteres que corresponden a un idioma y una configuración regional específicos.
Esta guía incluye las siguientes secciones:
Intercalaciones de MongoDB describe cómo MongoDB ordena los valores de cadena según la intercalación predeterminada y las intercalaciones personalizadas.
Especificar una intercalación describe cómo crear una
Collationinstancia de estructuraEstablecer una intercalación en una colección describe cómo establecer la intercalación para una nueva colección
Establecer una intercalación en un índice describe cómo establecer la intercalación para un índice
Establecer una intercalación en una operación describe cómo aplicar una intercalación a ciertas operaciones CRUD
Información adicional proporciona enlaces a recursos y documentación de API para los tipos y métodos mencionados en esta guía.
Intercalaciones de MongoDB
MongoDB ordena las cadenas mediante intercalación binaria de forma predeterminada. Este método de intercalación utiliza los valores de caracteres del estándar ASCII para comparar y ordenar las cadenas. Algunos idiomas y configuraciones regionales tienen convenciones específicas de ordenación de caracteres que difieren del estándar ASCII.
Tip
Para obtener más información sobre el estándar ASCII, consulte el ASCII Página de Wikipedia.
Por ejemplo, en francés canadiense, el carácter acentuado más a la derecha determina el orden de las cadenas cuando los demás caracteres son iguales. Considere las siguientes palabras en francés canadiense:
redil
coté
côte
côté
Al utilizar la intercalación binaria predeterminada, MongoDB ordena las palabras en el siguiente orden:
cote coté côte côté
En este orden de clasificación, "coté" se coloca antes de "côte" porque el estándar ASCII coloca el carácter "o" antes del carácter "ô".
Al utilizar la intercalación de francés canadiense, MongoDB ordena las palabras en el siguiente orden:
cote côte coté côté
En este orden de clasificación, "coté" se coloca después de "côte" porque las reglas de clasificación del francés canadiense colocan el carácter "e" antes del carácter "é".
Especifica una intercalación
Puede definir una intercalación especificando su configuración regional y otras opciones en una instancia de la estructura Collation. Para empezar a construir una instancia Collation, llame al método Collation::builder().
Nota
Instanciación de estructuras
El controlador de Rust implementa el patrón de diseño Builder para la creación de algunos tipos de estructura, incluido Collation. Puedes usar el método builder() para construir una instancia de cada tipo encadenando los métodos de construcción de opciones.
La siguiente tabla describe los métodos de construcción que se pueden usar para definir los campos de una instancia Collation. Debe usar el método locale() para construir una estructura Collation válida, pero todos los demás métodos de construcción son opcionales:
Método | Possible Values | Descripción |
|---|---|---|
locale() (Required) | Specifies the ICU locale | |
|
| Especifica el nivel de comparación a realizar |
case_level() | true, false | Specifies whether the driver performs case comparison |
|
| Especifica el orden de clasificación de las diferencias de casos durante las comparaciones de nivel terciario |
numeric_ordering() | true, false | Specifies whether the driver compares numeric strings as numbers |
|
| Especifica si el controlador considera los espacios en blanco y la puntuación como caracteres base durante la comparación de cadenas |
max_variable() | CollationMaxVariable::Punct,CollationMaxVariable::Space | Specifies which characters the driver ignores when alternate is set toCollationAlternate::Shifted |
|
| Especifica si el controlador realiza la normalización de texto para valores de cadena |
backwards() | true, false | Specifies whether the driver sorts strings containing diacritics in reverse character order |
Ejemplo
El siguiente ejemplo especifica una instancia Collation y establece la configuración regional de intercalación en "en_US":
let collation = Collation::builder() .locale("en_US") .build();
Establecer una intercalación en una colección
Al crear una nueva colección, puede definir la intercalación para futuras operaciones que se realicen en ella. Establezca la intercalación encadenando la función collation() al método create_collection() y pasando su instancia Collation como parámetro a collation().
Crear una colección con un ejemplo de intercalación
Este ejemplo especifica una intercalación según las convenciones locales "fr" (francés) y la aplica a una nueva colección llamada books. El campo strength se establece en CollationStrength::Primary para ignorar las diferencias en los diacríticos.
let collation = Collation::builder() .locale("fr") .strength(CollationStrength::Primary) .build(); let result = my_db.create_collection("books") .collation(collation) .await?;
Demostración de ordenamiento de intercalación
Si ejecuta una operación que admite intercalaciones en la books colección, la operación utiliza la intercalación especificada en el ejemplo Crear colección con una intercalación anterior.
Supongamos que la colección books contiene los siguientes documentos:
{ "name" : "Emma", "length" : "474" } { "name" : "Les Misérables", "length": "1462" } { "name" : "Infinite Jest", "length" : "1104" } { "name" : "Cryptonomicon", "length" : "918" } { "name" : "Ça", "length" : "1138" }
Tip
Para aprender a insertar documentos en una colección, consulte la Guía deinserción de documentos.
El siguiente ejemplo utiliza el método find() para devolver todos los documentos en los que el valor del campo name precede alfabéticamente a "Infinite Jest":
let query = doc! { "name": doc! { "$lt": "Infinite Jest" } }; let mut cursor = my_coll.find(query).await?; while let Some(doc) = cursor.try_next().await? { println!("{}", doc); }
{ "name": "Emma", "length": 474 } { "name": "Cryptonomicon", "length": 918 } { "name" : "Ça", "length" : "1138" }
Si no se especifica una intercalación para la colección books, el método find() sigue las reglas de intercalación binaria predeterminadas para determinar los valores name que preceden a "Infinite Jest". Estas reglas colocan las palabras que empiezan por "Ç" después de las que empiezan por "I". Por lo tanto, cuando la operación de búsqueda anterior sigue las reglas de intercalación binaria, el documento cuyo valor name es "Ça" no cumple los criterios de filtro.
Establece una intercalación en un índice
Al crear un nuevo índice en una colección, se puede definir la intercalación para las operaciones que abarca. Para ejecutar una operación que utilice el índice y su intercalación, la operación y el índice deben especificar la misma intercalación.
Tip
Establezca la intercalación del índice mediante la función collation() para crear una instancia IndexOptions. A continuación, pase IndexOptions como argumento a una función de creación IndexModel y IndexModel como argumento al método create_index().
Ejemplo
El siguiente ejemplo utiliza el método create_index() para crear un índice ascendente en el campo name y especifica una nueva intercalación correspondiente a la configuración regional "en_US":
let collation = Collation::builder() .locale("en_US") .build(); let index_opts = IndexOptions::builder() .collation(collation) .build(); let index = IndexModel::builder() .keys(doc! { "name": 1 }) .options(index_opts) .build(); let result = my_coll.create_index(index).await?; println!("Created index: {}", result.index_name);
Created index: name_1
Establecer una intercalación en una operación
Las operaciones que leen, actualizan y eliminan documentos de una colección pueden usar intercalaciones. Aplicar una intercalación a una operación anula cualquier intercalación previamente definida para una colección o índice.
Si aplica una intercalación a una operación que difiere de la intercalación de un índice, no podrá usar ese índice. Por lo tanto, la operación podría no ser tan eficiente como una que esté cubierta por un índice. Para obtener más información sobre las desventajas de ordenar operaciones que no estén cubiertas por un índice, consulte "Usar índices para ordenar resultados de consultas" en el manual del servidor.
Ejemplo
Este ejemplo realiza las siguientes acciones:
Establece la opción de intercalación
numeric_orderingatrue, lo que garantiza que los valores se ordenen en orden numérico en lugar de alfabético.Utiliza el método
find()para devolver documentos en los que el valor del campolengthes mayor que"1000"Especifica una intercalación encadenando el método
collation()al métodofind(), que anula la intercalación de la colección.
let collation = Collation::builder() .locale("en_US") .numeric_ordering(true) .build(); let filter = doc! { "length": doc! { "$gt": "1000" } }; let mut cursor = my_coll.find(filter) .collation(collation) .await?; while let Some(result) = cursor.try_next().await? { println!("{}", result); };
{ "name" : "Les Misérables", "length": "1462" } { "name" : "Infinite Jest", "length" : "1104" } { "name" : "Ça", "length" : "1138" }
Si ejecuta la operación de búsqueda anterior sin configurar la opción numeric_ordering en true, el controlador compara los valores length como cadenas y ordena el valor de la cadena "1000" antes de los valores "474" y "918". En este caso, la operación de búsqueda anterior devuelve todos los documentos de la colección books.
Información Adicional
Para obtener más información sobre el find() método, consulte la guía Recuperar datos.
Para obtener más información sobre las intercalaciones, consulte las siguientes páginas del manual del servidor:
Documentación de la API
Para obtener más información sobre cualquiera de los métodos o tipos mencionados en esta guía, consulte la siguiente documentación de API: