Docs Menu
Docs Home
/ /

Intercalaciones

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 Collation instancia de estructura

  • Establecer 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.

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 "é".

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)
For a full list of supported locales, see
in the Server manual.
Specifies the ICU locale

strength()

CollationStrength::Primary, CollationStrength::Secondary, CollationStrength::Tertiary, CollationStrength::Quaternary, CollationStrength::Identical

Especifica el nivel de comparación a realizar

case_level()
true, false
Specifies whether the driver performs case comparison

case_first()

CollationCaseFirst::Upper, CollationCaseFirst::Lower, CollationCaseFirst::Off

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

alternate()

CollationAlternate::NonIgnorable, CollationAlternate::Shifted

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 to
CollationAlternate::Shifted

normalization()

true, false

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

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();

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().

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?;

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.

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

Para obtener más información sobre los índices y las consultas cubiertas, consulte la guía Índices.

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().

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

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.

Este ejemplo realiza las siguientes acciones:

  • Establece la opción de intercalación numeric_ordering a true, 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 campo length es mayor que "1000"

  • Especifica una intercalación encadenando el método collation() al método find(), 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.

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:

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:

Volver

Monitoreo de conexión

En esta página