Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

intercalación

En esta guía, puedes aprender cómo utilizar intercalaciones con MongoDB para ordenar los resultados de tu consulta u operación de agregación por valores de strings. Una intercalación es un conjunto de reglas de ordenamiento y coincidencia de caracteres que se aplican a un idioma y localización específicos.

Puedes aprender más sobre intercalaciones en las siguientes secciones de esta guía:

Importante

Proyecto Reactor librería

Esta guía usa la librería Proyecto Reactor para consumir instancias Publisher devueltas por los métodos del driver Reactive Streams de Java. Para obtener más información sobre la biblioteca Project Reactor y cómo utilizarla, consulta Primeros pasos en la documentación de Reactor. Para obtener más información sobre cómo utilizamos los métodos de la librería Project Reactor en esta guía, consulta la guía Guardar datos en MongoDB.

MongoDB ordena las cadenas utilizando intercalación binaria de forma predeterminada. La intercalación binaria utiliza los valores de caracteres del estándar ASCII para comparar y ordenar cadenas. Ciertos lenguajes y localizaciones tienen convenciones específicas de ordenamiento de caracteres que difieren de los valores de caracteres ASCII.

Por ejemplo, en el francés canadiense, el carácter acentuado más a la derecha (diacrítico) determina el orden de las cadenas cuando todos los caracteres anteriores son iguales. Considera las siguientes palabras en francés canadiense:

  • manta

  • coté

  • côte

  • côté

Cuando se utiliza una intercalación binaria, MongoDB los ordena en el siguiente orden:

cote
coté
côte
côté

Cuando se utiliza la intercalación de francés canadiense, MongoDB los ordena en el siguiente orden:

cote
côte
coté
côté

MongoDB admite intercalaciones en la mayoría de las operaciones CRUD y agregaciones. Para obtener una lista completa de las operaciones compatibles, consulte la sección «Operaciones que admiten intercalaciones» en el manual del servidor MongoDB.

Puedes especificar el código de localización y variante opcional en el siguiente formato de string:

"<locale code>@collation=<variant code>"

El siguiente ejemplo especifica el código de localización "de" y el código de variante "phonebook":

"de@collation=phonebook"

Si no especifica una variante, utilice solo el código de localización.

Para obtener una lista completa de las configuraciones regionales compatibles, consulte Idiomas y configuraciones regionales compatibles en el manual del servidor MongoDB.

Las siguientes secciones muestran diferentes formas de aplicar intercalaciones en MongoDB:

Solo se puede establecer una intercalación predeterminada para una colección durante su creación. Sin embargo, se puede especificar una intercalación en un nuevo índice de una colección existente. Todas las operaciones compatibles que analizan la colección aplican la intercalación predeterminada. Consulte la sección Índice de esta guía para obtener más información.

El siguiente ejemplo muestra cómo especificar la intercalación de localización "en_US" al crear una nueva colección llamada items:

Mono.from(database.createCollection(
"items",
new CreateCollectionOptions().collation(
Collation.builder().locale("en_US").build())))
.block();

Para comprobar si creó la intercalación correctamente, obtenga una lista de los índices en esa colección de la siguiente manera:

List<Document> indexes = Flux.from(itemsCollection.listIndexes())
.collectList().block();
if (indexes != null) {
indexes.forEach(idx -> System.out.println(idx.toJson()));
}

La salida del código anterior debe contener lo siguiente:

{ ...
"collation": { "locale": "en_US", ... }
...
}

Puede especificar una intercalación al crear un nuevo índice en una colección. El índice almacena documentos en el orden especificado, lo que elimina la necesidad de ordenación en memoria durante las query. Para usar el índice, la operación debe usar la misma intercalación que la especificada en el índice y estar cubierta por ese índice.

El siguiente ejemplo muestra cómo crear un índice en el campo "nombre" con la intercalación de localización "en_US" en orden ascendente:

IndexOptions idxOptions = new IndexOptions();
idxOptions.collation(Collation.builder().locale("en_US").build());
Mono.from(itemsCollection.createIndex(
Indexes.ascending("name"), idxOptions)).block();

Para comprobar si creó la intercalación correctamente, obtenga una lista de los índices en esa colección de la siguiente manera:

List<Document> indexes = Flux.from(itemsCollection.listIndexes())
.collectList().block();
if (indexes != null) {
indexes.forEach(idx -> System.out.println(idx.toJson()));
}

La salida del código anterior debe contener lo siguiente:

{ ...
"collation": { "locale": "en_US", ... }
...
}

El siguiente ejemplo muestra una operación que especifica la misma intercalación y está cubierta por el índice creado en el ejemplo anterior:

FindPublisher<Document> indexPublisher = itemsCollection.find()
.collation(Collation.builder().locale("en_US").build())
.sort(Sorts.ascending("name"));
Flux.from(indexPublisher)
.doOnNext(doc -> System.out.println(doc.toJson()))
.blockLast();

Puedes anular la intercalación predeterminada pasando una nueva intercalación a una operación compatible. Sin embargo, sin un índice, la consulta realiza una ordenación en memoria, lo que resulta más lento que usar una intercalación indexada. Para obtener más información sobre las desventajas de las operaciones de ordenación no cubiertas por un índice,consulta «Usar índices para ordenar los resultados de las consultas» en el manual de MongoDB Server.

El siguiente ejemplo muestra una operación de query con las siguientes características:

  • La colección a la que se hace referencia tiene un "en_US" índice de intercalación predeterminado, similar al especificado en la sección Colección.

  • La query especifica la intercalación islandesa ("is"). Debido a que esto difiere de la intercalación del índice, la query no utiliza el índice y, en su lugar, realiza una clasificación en memoria.

FindPublisher<Document> customPublisher = itemsCollection.find()
.collation(Collation.builder().locale("is").build())
.sort(Sorts.ascending("name"));
Flux.from(customPublisher)
.doOnNext(doc -> System.out.println(doc.toJson()))
.blockLast();

La mayoría de los tipos de índice de MongoDB admiten la intercalación. Sin embargo, los siguientes tipos solo admiten la comparación binaria y no admiten la intercalación:

Esta sección abarca diversas opciones de intercalación y cómo especificarlas para refinar aún más el comportamiento de intercalación y comparación.

Opción de intercalación
Descripción

localización

Obligatorio. El código de configuración regional de la UCI para el idioma y la variante.
locale()

Hacia atrás

Especifica si se deben considerar primero los diacríticos desde el final de la cadena.
backwards()

Sensibilidad a mayúsculas y minúsculas

Especifica si se deben considerar las mayúsculas y minúsculas como valores diferentes.
caseLevel()

Alternativo

Especifica si se deben tener en cuenta los espacios y la puntuación.
collationAlternate()

Primero el caso

Especifica si se deben considerar primero las mayúsculas o las minúsculas.
interlationCaseFirst()

Variable máxima

Especifica si se deben ignorar los espacios en blanco o tanto los espacios en blanco como la puntuación. Esta configuración solo es válida cuando la configuración alternativa es "shifted".
collationMaxVariable()

Fuerza

Especifica el nivel de comparación de la UCI. El valor predeterminado es "terciario". Para obtener más información sobre cada nivel, consulte Niveles de comparación de la UCI.
collationStrength()

Normalización

Especifica si se debe realizar la normalización Unicode en el texto según sea necesario. Para obtener más información sobre la normalización Unicode, consulte Formularios de normalización Unicode.
normalization()

Ordenación numérica

Especifica si se deben ordenar los números según su valor numérico en lugar de según el orden de intercalación.
numericOrdering()

Puede utilizar la clase Collation.Builder para especificar valores para las opciones de intercalación anteriores. Llame al método build() para construir un objeto Collation como se muestra en el siguiente ejemplo:

Collation.builder()
.caseLevel(true)
.collationAlternate(CollationAlternate.SHIFTED)
.collationCaseFirst(CollationCaseFirst.UPPER)
.collationMaxVariable(CollationMaxVariable.SPACE)
.collationStrength(CollationStrength.SECONDARY)
.locale("en_US")
.normalization(false)
.numericOrdering(true)
.build();

Para obtener más información sobre los métodos y parámetros correspondientes, consulte la documentación de la API de Collation.Builder.

Esta sección contiene ejemplos de cómo utilizar operaciones de MongoDB que admiten intercalaciones. Para cada ejemplo, suponga que comienza con la siguiente colección de documentos:

{ "_id" : 1, "first_name" : "Klara" }
{ "_id" : 2, "first_name" : "Gunter" }
{ "_id" : 3, "first_name" : "Günter" }
{ "_id" : 4, "first_name" : "Jürgen" }
{ "_id" : 5, "first_name" : "Hannah" }

Los siguientes ejemplos utilizan la localización "de@collation=phonebook" y la intercalación de variantes. La parte "de" de la intercalación especifica la localización alemana y la parte "collation=phonebook" especifica una variante. La intercalación de localización "de" contiene reglas para priorizar los nombres propios, identificados por la capitalización de la primera letra. En la variante "collation=phonebook", los caracteres con diéresis se ordenan antes que los mismos caracteres sin ellos en una ordenación ascendente.

El siguiente ejemplo muestra cómo aplicar una intercalación al recuperar resultados ordenados de una colección. Para realizar esta operación, llama a find() en la colección de ejemplos y encadena los métodos collation() y sort() para especificar el orden en el que deseas recibir los resultados.

FindPublisher<Document> findPublisher = phonebookCollection.find()
.collation(Collation.builder()
.locale("de@collation=phonebook").build())
.sort(Sorts.ascending("first_name"));
Flux.from(findPublisher)
.doOnNext(doc -> System.out.println(doc.toJson()))
.blockLast();

Cuando realizas esta operación en la colección de ejemplo, la salida se asemeja a la siguiente:

{"_id": 3, "first_name": "Günter"}
{"_id": 2, "first_name": "Gunter"}
{"_id": 5, "first_name": "Hannah"}
{"_id": 4, "first_name": "Jürgen"}
{"_id": 1, "first_name": "Klara"}

Para obtener más información sobre los métodos y clases mencionados en esta sección, consulta la siguiente documentación de la API:

El siguiente ejemplo especifica una intercalación en una operación findOneAndUpdate() instanciando un objeto FindOneAndUpdateOptions y pasándolo como parámetro. El ejemplo realiza las siguientes operaciones:

  • Recupera el primer documento de la colección de ejemplos que precede a "Gunter" en orden ascendente.

  • Configura opciones para la operación, incluyendo la intercalación "de@collation=phonebook".

  • Añade un nuevo campo "verificado" con el valor "verdadero".

  • Recupera e imprime el documento actualizado.

Document updatedDoc = Mono.from(
phonebookCollection.findOneAndUpdate(
Filters.lt("first_name", "Gunter"),
Updates.set("verified", true),
new FindOneAndUpdateOptions()
.collation(Collation.builder()
.locale("de@collation=phonebook")
.build())
.sort(Sorts.ascending("first_name"))
.returnDocument(ReturnDocument.AFTER)))
.block();
if (updatedDoc != null) {
System.out.println("Updated document: " + updatedDoc.toJson());
}

Dado que "Günter" aparece léxicamente antes de "Gunter" al utilizar la intercalación de@collation=phonebook en orden ascendente, la operación anterior devuelve el siguiente documento:

Updated document: {"_id": 3, "first_name": "Günter", "verified": true}

Para obtener más información sobre los métodos y clases mencionados en esta sección, consulta la siguiente documentación de la API:

El siguiente ejemplo especifica una intercalación de ordenación numérica en una operación findOneAndDelete() al instanciar un objeto FindOneAndDeleteOptions y pasarlo como parámetro. La colección contiene los siguientes documentos:

{ "_id" : 1, "a" : "16 apples" }
{ "_id" : 2, "a" : "84 oranges" }
{ "_id" : 3, "a" : "179 bananas" }

La intercalación establece la opción locale en "en" y la opción numericOrdering en "true" para ordenar las cadenas en función de su valor numérico.

Document deletedDoc = Mono.from(
numericalCollection.findOneAndDelete(
Filters.gt("a", "100"),
new FindOneAndDeleteOptions()
.collation(Collation.builder()
.locale("en")
.numericOrdering(true)
.build())
.sort(Sorts.ascending("a"))))
.block();
if (deletedDoc != null) {
System.out.println("Deleted document: " + deletedDoc.toJson());
}

Después de ejecutar la operación anterior, el resultado se asemeja a lo siguiente:

Deleted document: {"_id": 3, "a": "179 bananas"}

El valor numérico de la string "179" es mayor que 100, por lo que el documento anterior es el único que coincide. Sin ordenación numérica, la intercalación binaria ordena "100" antes que "16", "84" y "179", por lo que el filtro coincide con todos los documentos.

Para obtener más información sobre los métodos y clases mencionados en esta sección, consulta la siguiente documentación de la API:

El siguiente ejemplo muestra cómo especificar una intercalación en una operación de agregación. Para realizar una agregación, llame al método aggregate() en un objeto MongoCollection.

Para especificar una intercalación para una operación de agregación, llame al método collation() en el AggregatePublisher devuelto por la operación de agregación. Especifique una etapa de agregación de ordenamiento en su pipeline para aplicar la intercalación.

El siguiente ejemplo construye una canalización de agregación en la colección de ejemplo y aplica una intercalación especificando lo siguiente:

  • Una etapa de agregación de grupo que utiliza Aggregates.group() para identificar cada documento por el campo first_name y usar ese valor como el _id del resultado.

  • Un acumulador en la etapa de grupo para sumar el número de instancias de valores coincidentes en el campo first_name.

  • Una ordenación ascendente en el campo _id de los documentos de salida.

  • Un objeto de intercalación que especifica la localización alemana y una fuerza de intercalación que ignora los acentos y las diéresis.

Bson groupStage = Aggregates.group(
"$first_name", Accumulators.sum("nameCount", 1));
Bson sortStage = Aggregates.sort(Sorts.ascending("_id"));
AggregatePublisher<Document> aggregatePublisher =
phonebookCollection
.aggregate(Arrays.asList(groupStage, sortStage))
.collation(Collation.builder()
.locale("de")
.collationStrength(CollationStrength.PRIMARY)
.build());
Flux.from(aggregatePublisher)
.doOnNext(doc -> System.out.println(doc.toJson()))
.blockLast();

El código anterior genera los siguientes documentos:

{"_id": "Gunter", "nameCount": 2}
{"_id": "Hannah", "nameCount": 1}
{"_id": "Jürgen", "nameCount": 1}
{"_id": "Klara", "nameCount": 1}

Para obtener más información sobre los métodos y clases mencionados en esta sección, consulta la siguiente documentación de la API: