Overview
En esta guía, puedes aprender a usar las intercalaciones para ordenar los resultados de tus operaciones de búsqueda o agregación según valores de strings. Una intercalación es un conjunto de convenciones de ordenación de caracteres que corresponde a un lenguaje y localización específicos.
Esta guía incluye las siguientes secciones:
MongoDB Intercalaciones describe cómo MongoDB ordena los valores de las strings según la intercalación por defecto 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 la API para los tipos y métodos mencionados en esta guía
Intercalaciones de MongoDB
Por defecto, MongoDB ordena las cadenas utilizando intercalación binaria. Este método de intercalación utiliza los valores estándar de los caracteres ASCII para comparar y ordenar strings. Ciertos idiomas y localizaciones 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 para las cadenas cuando los demás caracteres son iguales. Considera 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 posiciona el carácter "o" antes del carácter "ô".
Cuando se utiliza la intercalación en francés canadiense, MongoDB clasifica 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 intercalación del francés canadiense posicionan 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
Creando instancias de estructuras
El controlador de Rust implementa el patrón de diseño Builder para la creación de algunos tipos de struct, incluido Collation. Puedes usar el método builder() para construir una instancia de cada tipo encadenando métodos de opción builder.
La siguiente tabla describe los métodos de constructor que puedes usar para establecer campos de una instancia de Collation. Debes usar el método locale() para compilar una estructura Collation válida, pero todos los demás métodos de constructor 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 driver considera el espacio en blanco y la puntuación como caracteres base durante la comparación de string |
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 string |
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();
Establece una intercalación en una colección
Cuando se crea una nueva colección, se puede definir la intercalación para futuras operaciones que se realicen en esa colección. Configura la intercalación encadenando la función collation() al método create_collection(), pasando tu 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 se ejecuta una operación que admite intercalaciones en la colección books, la operación utiliza la intercalación especificada en el Ejemplo de crear colección con una intercalación.
Suponga 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 por defecto para determinar los valores name que preceden a "Infinite Jest". Estas reglas sitúan las palabras que comienzan con "Ç" después de las que comienzan con "I". Así que, cuando la operación de búsqueda anterior sigue las reglas de intercalación binaria, el documento en el que el valor name es "Ça" no cumple con los criterios del 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
Configure la intercalación del índice utilizando la función collation() para compilar una instancia de IndexOptions. Luego, pasa tu IndexOptions como argumento a una función de constructor IndexModel, y pasa tu 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 localización "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 se aplica una intercalación a una operación que difiere de la intercalación de un índice, no se puede usar ese índice. Como resultado, es posible que la operación no se realice con la misma eficiencia que una que esté cubierta por un índice. Para más información sobre las desventajas de las operaciones de ordenación no cubiertas por un índice, consulta Uso de índices para ordenar resultados de queries 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(), lo 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 aprender más sobre el método find(), consulta la guía Recuperar datos.
Para aprender más sobre intercalaciones, consultar 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, consulta la siguiente documentación API: