Overview
En esta guía, puedes aprender a usar intercalaciones para ordenar los resultados de tus queries o operaciones de agregación por valores de string. Una intercalación es un conjunto de convenciones de ordenación de caracteres que se aplican a un lenguaje y localización específicos.
Intercalaciones en MongoDB
Por defecto, MongoDB ordena las cadenas utilizando intercalación binaria. Este método de intercalación utiliza el Estándar ASCII valores de caracteres para comparar y ordenar cadenas. Algunos idiomas y localizaciones 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 para las cadenas cuando los demás caracteres son iguales. Considera las siguientes palabras en francés canadiense:
manta
coté
côte
côté
Cuando se utiliza la intercalación binaria por defecto, 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é
Especifica una intercalación
Para especificar una intercalación, crea una Collation objeto. Debes definir el campo Locale del objeto Collation; todos los demás campos son opcionales. Por ejemplo, el siguiente ejemplo de código especifica un objeto Collation con la intercalación de la localización "en_US":
myCollation := &options.Collation{Locale: "en_US"}
Para obtener una lista completa de los campos de Collation objeto, visita la documentación de la API de intercalación. Para ver todas las localizaciones admitidas y los valores predeterminados de los campos Locale, visita Idiomas y localizaciones admitidas.
Establecer una intercalación en una colección o vista
Puedes aplicar una intercalación al crear una colección o vista nueva. Esto define la intercalación por defecto para cualquier operación que se realice en esa colección o vista. Establecer una intercalación a través de un objeto CreateCollectionOptions o CreateViewOptions. Luego, llama al método CreateCollection() o CreateView() con tu objeto de opciones como argumento.
Crear un ejemplo de colección
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) }
Use el ejemplo de intercalación por defecto
Si llamas a una operación que utiliza una intercalación en la colección books, la operación utiliza la intercalación predeterminada especificada en el Ejemplo de creación de una colecció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"}
Nota
Para aprender a insertar documentos, consulte Inserte un documento.
El siguiente ejemplo utiliza el método Find() para devolver todos los documentos con un valor name que antecede 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 por defecto books, el método Find() seguiría las reglas de ordenación binaria por defecto para determinar los valores name que preceden a "Infinite Jest". Estas reglas colocan las palabras que comienzan con “Ç” después de las que comienzan con “I”. La salida se parecería a lo siguiente:
{"name":"Emma","length":"474"} {"name":"Cryptonomicon","length":"918"}
Para obtener más información sobre el método Find(), consulta Recuperar datos.
Establece una intercalación en un índice
Puede aplicar una intercalación al crear un nuevo índice en una colección. El índice almacena una representación ordenada de los documentos en la colección, por lo que tu instancia de MongoDB no realiza la ordenación para las operaciones de ordenamiento en memoria.
Para utilizar el índice en una operación, su operación debe utilizar la misma intercalación que la especificada en el índice. Además, asegúrate de que la operación esté cubierta por el índice que contiene la intercalación. Establece una intercalación a través de un objeto IndexOptions y pasa este objeto como argumento al método CreateOne().
Ejemplo
Después de crear la colección books y aplicar una intercalación por defecto, como se muestra en la sección Ejemplo de creación de una colección, no se puede cambiar la intercalación por defecto de la colección. Sin embargo, 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 localización "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
Establecer una intercalación en una operación
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 aplicas una nueva intercalación a una operación que difiere de la intercalación de un índice, no puedes usar ese índice. Por lo tanto, la operación puede no tener el mismo rendimiento que una operación cubierta por un índice. Para obtener más información sobre las desventajas de las operaciones de ordenación que no están cubiertas por un índice, consulta Uso de índices para ordenar los resultados de query. Consulta el manual de MongoDB para obtener una lista de operaciones que admiten intercalación.
Ejemplo
Puede usar operaciones que admitan la intercalación para actualizar y query documentos en la colección books.
El siguiente ejemplo usa el método Find() para devolver documentos en los que el valor length es mayor que "1000". El campo de intercalación NumericOrdering tiene un valor de true para asegurar que los valores se ordenen en orden numérico en lugar de orden alfabético:
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 los valores length como strings. En ese caso, la salida se parece a lo siguiente:
{"name":"Emma","length":"474"} {"name":"Les Misérables","length":"1462"} {""name":"Infinite Jest","length":"1104"} {"name":"Cryptonomicon","length":"918"} {"name":"Ça","length":"1138"}
Información Adicional
Para aprender más sobre el método Find(), consulta la guía Recuperar datos.
Para obtener más información sobre las intercalaciones, consulta las siguientes páginas del manual:
Documentación de la API
Para obtener más información sobre los métodos que se abordan en esta guía, consulte la siguiente documentación de la API: