Docs Menu
Docs Home
/ /

Intercalaciones

En esta guía, aprenderá a usar intercalaciones para ordenar los resultados de sus consultas o agregaciones por valores de cadena. Una intercalación es un conjunto de convenciones de ordenación de caracteres que se aplican a un idioma y una configuración regional específicos.

MongoDB ordena las cadenas mediante intercalación binaria de forma predeterminada. Este método de intercalación utiliza Valores de caracteres estándar ASCII para comparar y ordenar cadenas. Algunos idiomas y configuraciones regionales tienen convenciones específicas de ordenación de caracteres que difieren del estándar ASCII.

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 los ordena en el siguiente orden:

cote
coté
côte
côté

Al utilizar la intercalación francesa canadiense, MongoDB los ordena en el siguiente orden:

cote
côte
coté
côté

Para especificar una intercalación, cree un Collation Objeto. Debe definir el campo Locale del objeto Collation; los demás campos son opcionales. Por ejemplo, el siguiente ejemplo de código especifica un objeto Collation con la intercalación de configuración regional "en_US":

myCollation := &options.Collation{Locale: "en_US"}

Para obtener una lista completa de los campos Collation de objeto, visite la documentación de la API de intercalación. Para ver todas las configuraciones regionales compatibles y los valores predeterminados de los Locale campos, visite Idiomas y configuraciones regionales compatibles.

Puedes aplicar una intercalación al crear una nueva colección o vista. Esto define la intercalación predeterminada para cualquier operación realizada en esa colección o vista. Establece una intercalación mediante un objeto CreateCollectionOptions o CreateViewOptions. A continuación, llama al método CreateCollection() o CreateView() con el objeto de opciones como argumento.

El siguiente ejemplo crea una nueva colección llamada books y especifica una intercalación por defecto con la localización "fr". El campo de intercalación Strength tiene un valor de 1 para ignorar las diferencias en los acentos de las letras.

myCollation := &options.Collation{Locale: "fr", Strength: 1}
opts := options.CreateCollection().SetCollation(myCollation)
err := db.CreateCollection(context.TODO(), "books", opts)
if err != nil {
panic(err)
}

Si llama a una operación que utiliza una intercalación en la books colección, la operación utiliza la intercalación predeterminada especificada en el Ejemplo de creación de una colección.

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"}

Nota

Para aprender a insertar documentos, consulte Insertar un documento.

El siguiente ejemplo utiliza el método Find() para devolver todos los documentos con un valor name que precede alfabéticamente a "Infinite Jest":

filter := bson.D{{"name", bson.D{{"$lt", "Infinite Jest"}}}}
cursor, err := coll.Find(context.TODO(), filter)
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}
{"name":"Emma","length":"474"}
{"name":"Cryptonomicon","length":"918"}
{"name":"Ça","length":"1138"}

Sin especificar una intercalación books predeterminada, el método Find() seguiría 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". El resultado sería similar al siguiente:

{"name":"Emma","length":"474"}
{"name":"Cryptonomicon","length":"918"}

Para obtener más información sobre el Find() método, consulte Recuperar datos.

Puedes aplicar una intercalación al crear un nuevo índice en una colección. El índice almacena una representación ordenada de los documentos de la colección, por lo que tu instancia de MongoDB no realiza la ordenación de las operaciones de ordenación en memoria.

Para usar el índice en una operación, esta debe usar la misma intercalación que la especificada en el índice. Además, asegúrese de que la operación esté cubierta por el índice que contiene la intercalación. Establezca una intercalación mediante un objeto IndexOptions y páselo como argumento al método CreateOne().

Después de crear la books colección y aplicar una intercalación predeterminada, como se muestra en la sección "Ejemplo de creación de una colección", no se puede cambiar la intercalación predeterminada de la colección. Sin embargo, se puede crear un índice para la colección con una intercalación diferente.

El siguiente ejemplo utiliza el método CreateOne() para crear un índice ascendente en el campo name y especifica una nueva intercalación con una configuración regional "en_US":

myCollation := &options.Collation{Locale: "en_US"}
opts := options.Index().SetCollation(myCollation)
indexModel := mongo.IndexModel{
Keys: bson.D{{"name", 1}},
Options: opts,
}
name, err := coll.Indexes().CreateOne(context.TODO(), indexModel)
if err != nil {
panic(err)
}
fmt.Println("Name of Index Created: " + name)
Name of Index Created: name_1

Las operaciones que leen, actualizan y eliminan documentos de una colección pueden utilizar intercalaciones. Al aplicar una intercalación a una operación se anula cualquier intercalación por defecto previamente definida para una colección.

Si aplica una nueva intercalación a una operación que difiere de la intercalación de un índice, no podrá usar ese índice. Como resultado, la operación podría no funcionar tan bien como una que esté cubierta por un índice. Para obtener más información sobre las desventajas de las operaciones de ordenación no cubiertas por un índice, consulte "Usar índices para ordenar los resultados de consultas". Consulte el manual de MongoDB para obtener una lista de las operaciones que admiten la intercalación.

Puede utilizar operaciones que admitan la intercalación para actualizar y consultar documentos en la colección books.

El siguiente ejemplo utiliza el método Find() para devolver documentos cuyo valor length es mayor que "1000". El campo de intercalación NumericOrdering tiene un valor de true para garantizar que los valores se ordenen numéricamente en lugar de alfabéticamente:

filter := bson.D{{"length", bson.D{{"$gt", "1000"}}}}
myCollation := &options.Collation{Locale: "en_US", NumericOrdering: true}
opts := options.Find().SetCollation(myCollation)
cursor, err := coll.Find(context.TODO(), filter, opts)
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}
{"name":"Les Misérables","length":"1462"}
{"name":"Infinite Jest","length":"1104"}
{"name":"Ça","length":"1138"}

Sin especificar una intercalación con un campo NumericOrdering establecido en true, la misma operación Find() compara valores length como cadenas. En este caso, el resultado es similar al siguiente:

{"name":"Emma","length":"474"}
{"name":"Les Misérables","length":"1462"}
{""name":"Infinite Jest","length":"1104"}
{"name":"Cryptonomicon","length":"918"}
{"name":"Ça","length":"1138"}

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, visite las siguientes páginas del manual:

Para obtener más información sobre los métodos analizados en esta guía, consulte la siguiente documentación de API:

Volver

Ejecute un comando

En esta página