Docs Menu
Docs Home
/

Intercalación

La intercalación permite a los usuarios especificar reglas específicas de un lenguaje para la comparación de strings, como reglas para mayúsculas y acentos.

Puede especificar la intercalación para una colección o una vista, un índice u operaciones específicas que soportan la intercalación.

Para especificar la intercalación al consultar documentos en la interfaz de usuario de MongoDB Atlas, consulte Especificar intercalación.

Un documento de intercalación tiene los siguientes campos:

{
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

Al especificar la intercalación, el locale Este campo es obligatorio; todos los demás campos de intercalación son opcionales. Para obtener descripciones de los campos, consulte el documento de intercalación.

Los valores predeterminados de los parámetros de intercalación varían según la configuración regional que especifique. Para obtener una lista completa de los parámetros de intercalación predeterminados y las configuraciones regionales a las que están asociados, consulte Parámetros predeterminados de intercalación.

Campo
Tipo
Descripción

locale

string

La localización de ICU. Consulte Idiomas y localizaciones compatibles para obtener una lista de las localizaciones admitidas.

Para especificar una comparación binaria simple, especifique el valor locale de "simple".

strength

entero

Opcional. El nivel de comparación a realizar. Corresponde a los niveles de comparación de la UCI.Los valores posibles son:

Valor
Descripción

1

Nivel primario de comparación. La intercalación realiza comparaciones únicamente de los caracteres base e ignora otras diferencias, como los diacríticos y la diferencia entre mayúsculas y minúsculas.

2

Nivel secundario de comparación. La intercalación realiza comparaciones hasta las diferencias secundarias, como los diacríticos. Es decir, la intercalación realiza comparaciones de caracteres base (diferencias primarias) y diacríticos (diferencias secundarias). Las diferencias entre los caracteres base tienen prioridad sobre las diferencias secundarias.

3

Nivel terciario de comparación. La intercalación realiza comparaciones hasta diferencias terciarias, como las variantes de mayúsculas, minúsculas y de letras. Es decir, la intercalación realiza comparaciones de caracteres base (diferencias primarias), diacríticos (diferencias secundarias) y diferencias entre mayúsculas y minúsculas y variantes (diferencias terciarias). Las diferencias entre los caracteres base tienen prioridad sobre las diferencias secundarias, que, a su vez, tienen prioridad sobre las diferencias terciarias.

Este es el nivel por defecto.

4

Nivel cuaternario. Limitado a un caso de uso específico para considerar la puntuación cuando los niveles 1-3 ignoran la puntuación o para el procesamiento de texto en japonés.

5

Nivel idéntico. Limitado para un caso de uso específico de desempate.

Consulte Intercalación de ICU: Niveles de comparación para obtener más detalles.

caseLevel

booleano

Opcional. Indicador que determina si se debe incluir la comparación de mayúsculas y minúsculas en el nivel strength, 1 o 2.

Si true, incluya la comparación de mayúsculas y minúsculas:

  • Cuando se usa con strength:1, la intercalación compara caracteres base y mayúsculas y minúsculas.

  • Cuando se usa con strength:2, la intercalación compara caracteres base, diacríticos (y otras posibles diferencias secundarias) y mayúsculas y minúsculas.

Si false, no incluya la comparación de mayúsculas y minúsculas en el nivel 1 o 2. El valor por defecto es false.

Para obtener más información, consulte Intercalación de ICU: Nivel de diferencias entre mayúsculas y minúsculas.

caseFirst

string

Opcional. Un campo que determina el orden de clasificación de las diferencias de mayúsculas y minúsculas durante las comparaciones de nivel terciario.

Los valores posibles son:

Valor
Descripción

"upper"

Las mayúsculas se ordenan antes que las minúsculas.

"lower"

Las minúsculas se ordenan antes que las mayúsculas.

"off"

Valor por defecto. Similar a "lower" con pequeñas diferencias. Consulte https://unicode-org.github.io/icu/userguide/strings/properties.html#customization para ver más detalles sobre las diferencias.

numericOrdering

booleano

Opcional. Indicador que determina si se deben comparar las strings numéricas como números o como strings.

Si true, compárelas como números. Por ejemplo, "10" es mayor que "2".

Si false, compárelas como strings. Por ejemplo, "10" es menor que "2".

El valor por defecto es false.

Vea restricciones de orden numérico.

alternate

string

Opcional. Campo que determina si la intercalación debe considerar los espacios en blanco y la puntuación como caracteres base a los efectos de la comparación.

Los valores posibles son:

Valor
Descripción

"non-ignorable"

Los espacios en blanco y la puntuación se consideran caracteres base.

"shifted"

Los espacios en blanco y los signos de puntuación no se consideran caracteres base y solo se distinguen en niveles de fuerza superiores a 3.

Consulte Intercalación de ICU: Niveles de comparación para obtener más información.

El valor por defecto es "non-ignorable".

maxVariable

string

Opcional. Campo que determina hasta qué caracteres se consideran ignorables cuando alternate: "shifted". No tiene efecto si alternate: "non-ignorable".

Los valores posibles son:

Valor
Descripción

"punct"

Tanto los espacios en blanco como la puntuación son ignorables y no se consideran caracteres base.

"space"

Los espacios en blanco son ignorables y no se consideran caracteres base.

backwards

booleano

Opcional. Indicador que determina si las strings con diacríticos se ordenan desde el final de la string, como en algunos ordenamientos de diccionarios franceses.

Si true, compare de atrás hacia adelante.

Si false, compare de adelante hacia atrás.

El valor por defecto es false.

normalization

booleano

Opcional. Indicador que determina si se debe verificar si el texto requiere normalización y realizar la normalización. En general, la mayoría del texto no requiere este procesamiento de normalización.

Si true, compruebe si está completamente normalizado y realice la normalización para comparar el texto.

Si false, no lo comprueba.

El valor por defecto es false.

Consulte https://unicode-org.github.io/icu/userguide/collation/concepts.html#normalization para obtener más detalles.

Puede especificar la intercalación para las siguientes operaciones:

Nota

No puedes especificar varias intercalaciones para una operación. Por ejemplo, no puedes especificar diferentes intercalaciones por campo, o si realizas una búsqueda con un ordenamiento, no puedes usar una intercalación para la búsqueda y otra para el ordenamiento.

[1](1, 2) Algunos tipos de índices no admiten la intercalación. Consulte Intercalación y tipos de índices no compatibles para obtener más detalles.

Algunas localizaciones de intercalación tienen variantes que usan reglas específicas del lenguaje. Para especificar una variante de localización, utilice la siguiente sintaxis:

{ "locale" : "<locale code>@collation=<variant>" }

Por ejemplo, para utilizar la variante unihan de la intercalación china:

{ "locale" : "zh@collation=unihan" }

Para obtener una lista completa de todas las localizaciones de intercalación y sus variantes, consulte Localizaciones de intercalación.

  • Puede especificar una intercalación por defecto para una vista al momento de su creación. Si no se especifica ninguna intercalación, la intercalación por defecto de la vista es el intercalador de comparación binaria "simple". Es decir, la vista no hereda la intercalación por defecto de la colección.

  • Las comparaciones de string en la vista utilizan la intercalación por defecto de la vista. Una operación que intente cambiar o sobrescribir la intercalación por defecto de una vista fallará con un error.

  • Si crea una vista a partir de otra vista, no puede especificar una intercalación que difiera de la intercalación de la vista de origen.

  • Si realiza una agregación que implique varias vistas, como con $lookup o $graphLookup, las vistas deben tener la misma intercalación.

Para utilizar un índice para las comparaciones de cadenas, una operación también debe especificar la misma intercalación. Es decir, un índice con una intercalación no puede soportar una operación que realice comparaciones de strings en los campos indexados si la operación especifica una intercalación diferente.

Advertencia

Debido a que los índices configurados con intercalación utilizan claves de intercalación ICU para lograr el orden de clasificación, las claves de índice que consideran la intercalación pueden ser más grandes que las claves de índice para los índices sin intercalación.

Una colección restaurants tiene los siguientes documentos:

db.restaurants.insertMany( [
{ _id: 1, category: "café", status: "Open" },
{ _id: 2, category: "cafe", status: "open" },
{ _id: 3, category: "cafE", status: "open" }
] )

La colección restaurants tiene un índice en un campo de string category con la intercalación de la localización "fr".

db.restaurants.createIndex( { category: 1 }, { collation: { locale: "fr" } } )

La siguiente query, que especifica la misma intercalación que el índice, puede utilizar el índice:

db.restaurants.find( { category: "cafe" } ).collation( { locale: "fr" } )

Sin embargo, la siguiente operación de query, que por defecto utiliza el intercalador binario "simple", no puede usarse el índice:

db.restaurants.find( { category: "cafe" } )

Para un índice compuesto donde las claves prefijo del índice no son cadenas, arreglos ni documentos incrustados, una operación que especifique una intercalación diferente puede seguir utilizando el índice para soportar comparaciones en las claves prefijo del índice.

Por ejemplo, la colección restaurants tiene un índice compuesto en los campos numéricos score y price y el campo de string category; el índice se crea con la localización de intercalación "fr" para comparaciones de strings:

db.restaurants.createIndex(
{ score: 1, price: 1, category: 1 },
{ collation: { locale: "fr" } } )

Las siguientes operaciones, que utilizan la intercalación binaria "simple" para las comparaciones de strings, pueden usar el índice:

db.restaurants.find( { score: 5 } ).sort( { price: 1 } )
db.restaurants.find( { score: 5, price: { $gt: Decimal128( "10" ) } } ).sort( { price: 1 } )

La siguiente operación, que utiliza la intercalación binaria "simple" para las comparaciones de string en el campo category indexado, puede usar el índice para cumplir solo con la parte score: 5 de la query:

db.restaurants.find( { score: 5, category: "cafe" } )

Para confirmar si una consulta ha utilizado un índice, ejecuta la consulta con la opción explain().

Importante

Las coincidencias con claves de documentos, incluidas las claves de documentos incrustadas, utilizan una comparación binaria simple. Esto significa que un query para una clave como "type.café" no coincidirá con la clave "type.cafe", independientemente del valor que establezcas para el parámetro strength.

Los siguientes índices solo admiten la comparación binaria simple y no admiten la intercalación:

Tip

Para crear un índice text o 2d en una colección que tenga una intercalación no simple, debe especificar explícitamente {collation: {locale: "simple"} } al crear el índice.

Al especificar el numericOrdering como true, se aplican las siguientes restricciones:

  • Solo se consideran en las comparaciones las substrings de enteros no negativos contiguos de dígitos.

    numericOrdering no soporta:

    • +

    • -

    • separadores decimales, como puntos y comas decimales

    • exponentes

  • Solo los puntos de código Unicode en la categoría de Número o dígito decimal (Nd) se consideran dígitos.

  • Si la longitud de un número supera los 254 caracteres, los caracteres excedentes se tratan como un número independiente.

Considere una colección con los siguientes valores de strings numéricas y decimales:

db.c.insertMany(
[
{ "n" : "1" },
{ "n" : "2" },
{ "n" : "2.1" },
{ "n" : "-2.1" },
{ "n" : "2.2" },
{ "n" : "2.10" },
{ "n" : "2.20" },
{ "n" : "-10" },
{ "n" : "10" },
{ "n" : "20" },
{ "n" : "20.1" }
]
)

El siguiente query find utiliza un documento de intercalación que contiene el parámetro numericOrdering:

db.c.find(
{ }, { _id: 0 }
).sort(
{ n: 1 }
).collation( {
locale: 'en_US',
numericOrdering: true
} )

La operación devuelve los siguientes resultados:

[
{ n: '-2.1' },
{ n: '-10' },
{ n: '1' },
{ n: '2' },
{ n: '2.1' },
{ n: '2.2' },
{ n: '2.10' },
{ n: '2.20' },
{ n: '10' },
{ n: '20' },
{ n: '20.1' }
]
  • numericOrdering: true ordena los valores de strings en orden ascendente como si fueran valores numéricos.

  • Los dos valores negativos -2.1 y -10 no están ordenados en el orden de clasificación esperado porque tienen caracteres - no admitidos.

  • El valor 2.2 se ordena antes que el valor 2.10, debido a que el parámetro numericOrdering no admite valores decimales.

  • Como resultado, 2.2 y 2.10 se ordenan en orden lexicográfico.

Una colección restaurants tiene los siguientes documentos:

db.restaurants.insertMany( [
{ _id: 1, category: "café", status: "Open" },
{ _id: 2, category: "cafe", status: "open" },
{ _id: 3, category: "cafE", status: "open" }
] )

La siguiente operación find() utiliza intercalación:

db.restaurants.find(
{ category: "cafe", status: "Open" }
).collation( { locale: "fr", strength: 1 } )
[
{ _id: 1, category: 'café', status: 'Open' },
{ _id: 2, category: 'cafe', status: 'open' },
{ _id: 3, category: 'cafE', status: 'open' }
]

El filtro especifica una intercalación con strength: 1, lo que significa que el query ignora las diferencias entre mayúsculas y minúsculas. Como resultado, aunque no exista un documento que coincida exactamente con las variantes de mayúsculas y minúsculas especificadas en el filtro, la operación devuelve todos los documentos de la colección.

Volver

Optimización del rendimiento

En esta página