Docs Menu
Docs Home
/ /

Intercalaciones

Las intercalaciones son conjuntos de reglas sobre cómo comparar cadenas, normalmente en un lenguaje natural particular.

Por ejemplo, en francés canadiense, el último acento de una palabra determinada determina el orden de clasificación.

Considere las siguientes palabras francesas:

cote < coté < côte < côté

El orden de clasificación utilizando la intercalación francesa canadiense daría como resultado lo siguiente:

cote < côte < coté < côté

Si no se especifica la intercalación, MongoDB utiliza la comparación binaria simple para cadenas. Por lo tanto, el orden de clasificación de las palabras sería:

cote < coté < côte < côté

Puede especificar una intercalación predeterminada para colecciones e índices al crearlos, o bien para operaciones CRUD y agregaciones. Para las operaciones que admiten intercalación, MongoDB utiliza la intercalación predeterminada de la colección, a menos que la operación especifique una diferente.

'collation' => {
'locale' => <string>,
'caseLevel' => <bool>,
'caseFirst' => <string>,
'strength' => <int>,
'numericOrdering' => <bool>,
'alternate' => <string>,
'maxVariable' => <string>,
'normalization' => <bool>,
'backwards' => <bool>
}

El único parámetro requerido es locale, que el servidor analiza como un ID de configuración regional del formato ICUPor ejemplo, configure locale en en_US para representar inglés fr_CA de EE. UU. o para representar francés de Canadá.

Para obtener una descripción completa de los parámetros disponibles, consulte la entrada del manual de MongoDB.

El siguiente ejemplo crea una nueva colección llamada contacts en la base de datos test y le asigna una intercalación predeterminada con la configuración regional fr_CA. Al especificar una intercalación al crear la colección, se garantiza que todas las operaciones que impliquen una consulta y se ejecuten en la colección contacts utilicen la intercalación fr_CA, a menos que la consulta especifique otra. Los índices de la nueva colección también heredan la intercalación predeterminada, a menos que el comando de creación especifique otra.

client = Mongo::Client.new([ "127.0.0.1:27017" ], :database => "test")
client[:contacts, { "collation" => { "locale" => "fr_CA" } } ].create

Para especificar una intercalación para un índice, utilice la opción collation al crear el índice.

El siguiente ejemplo crea un índice en el campo name de la colección address_book, con el parámetro unique habilitado y una intercalación predeterminada con locale establecida en en_US.

client = Mongo::Client.new([ "127.0.0.1:27017" ], :database => "test")
client[:address_book].indexes.create_one( { "first_name" => 1 },
"unique" => true,
"collation" => { "locale" => "en_US" }
)

Para usar este índice, asegúrese de que sus consultas también especifiquen la misma intercalación. La siguiente consulta utiliza el índice anterior:

client[:address_book].find({"first_name" : "Adam" },
"collation" => { "locale" => "en_US" })

Las siguientes consultas NO utilizan el índice. La primera consulta no utiliza intercalación, y la segunda utiliza una intercalación con un strength valor diferente al del índice.

client[:address_book].find({"first_name" : "Adam" })
client[:address_book].find({"first_name" : "Adam" },
"collation" => { "locale" => "en_US", "strength" => 2 })

Todos los métodos de lectura, actualización y eliminación admiten la intercalación. A continuación se muestran algunos ejemplos.

Las consultas individuales pueden especificar una intercalación para comparar y ordenar los resultados. La siguiente operación de consulta y ordenación utiliza una intercalación alemana con el parámetro locale establecido en de.

client = Mongo::Client.new([ "127.0.0.1:27017" ], :database => "test")
docs = client[:contacts].find({ "city" => "New York" },
{ "collation" => { "locale" => "de" } }).sort( "name" => 1 )

Una colección llamada names contiene los siguientes documentos:

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

La siguiente operación find_one_and_update en la colección no especifica una intercalación.

client = Mongo::Client.new([ "127.0.0.1:27017" ], :database => "test")
doc = client[:names].find_one_and_update( {"first_name" => { "$lt" => "Gunter" }},
{ "$set" => { "verified" => true } })

Debido a que Gunter es léxicamente el primero en la colección, la operación anterior no devuelve resultados ni actualiza ningún documento.

Considere la misma operación find_one_and_update, pero con la intercalación especificada. La configuración regional está establecida en de@collation=phonebook.

Nota

Algunas configuraciones regionales tienen la opción collation=phonebook disponible para idiomas que ordenan los nombres propios de forma diferente a otras palabras. Según la intercalación de@collation=phonebook, los caracteres con diéresis preceden a los mismos caracteres sin diéresis.

client = Mongo::Client.new([ "127.0.0.1:27017" ], :database => "test")
doc = client[:names].find_one_and_update( { "first_name" => { "$lt" => "Gunter" } },
{ "$set" => { "verified" => true } }, { "collation" => { "locale" => "de@collation=phonebook" },
:return_document => :after } )

La operación devuelve el siguiente documento actualizado:

{ "_id" => 3, "first_name" => "Günter", "verified" => true }

Establezca el parámetro de intercalación numericOrdering en true para comparar cadenas numéricas por sus valores numéricos.

La colección numbers contiene los siguientes documentos:

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

El siguiente ejemplo coincide con el primer documento en el que el campo a tiene un valor numérico mayor que 100 y lo elimina.

docs = numbers.find_one_and_delete({ "a" => { "$gt" => "100" } },
{ "collation" => { "locale" => "en", "numericOrdering" => true } })

Tras la operación mencionada, quedan en la colección los siguientes documentos:

{ "_id" : 1, "a" : "16" }
{ "_id" : 2, "a" : "84" }

Si realiza la misma operación sin intercalación, el servidor elimina el primer documento que encuentre en el que el valor léxico de a sea mayor que "100".

numbers = client[:numbers]
docs = numbers.find_one_and_delete({ "a" => { "$gt" => "100" } })

Después de la operación anterior, se ha eliminado el documento en el que a era igual a "16" y los siguientes documentos permanecen en la colección:

{ "_id" : 2, "a" : "84" }
{ "_id" : 3, "a" : "179" }

Puede utilizar intercalaciones con todas las distintas operaciones masivas que existen en el controlador Ruby.

La colección recipes contiene los siguientes documentos:

{ "_id" : 1, "dish" : "veggie empanadas", "cuisine" : "Spanish" }
{ "_id" : 2, "dish" : "beef bourgignon", "cuisine" : "French" }
{ "_id" : 3, "dish" : "chicken molé", "cuisine" : "Mexican" }
{ "_id" : 4, "dish" : "chicken paillard", "cuisine" : "french" }
{ "_id" : 5, "dish" : "pozole verde", "cuisine" : "Mexican" }

Al establecer el parámetro strength del documento de intercalación en 1 o 2, el servidor ignora las mayúsculas y minúsculas en el filtro de consulta. El siguiente ejemplo utiliza un filtro de consulta que no distingue entre mayúsculas y minúsculas para eliminar todos los registros en los que el campo cuisine coincide con French.

client = Mongo::Client.new([ "127.0.0.1:27017" ], :database => "test")
recipes = client[:recipes]
docs = recipes.delete_many({ "cuisine" => "French" },
"collation" => { "locale" => "en_US", "strength" => 1 })

Después de ejecutar la operación anterior, los documentos con valores _id de 2 y 4 se eliminan de la colección.

Para utilizar la intercalación con una operación de agregación, especifique una intercalación en las opciones de agregación.

El siguiente ejemplo de agregación utiliza una colección llamada names y agrupa el campo first_name, cuenta la cantidad total de resultados en cada grupo y ordena los resultados según el orden de la guía telefónica alemana.

aggregation = names.aggregate(
[
{
"$group" => { "_id" => "$first_name", "name_count" => { "$sum" => 1 } }
},
{
"$sort" => { "_id" => 1 }
},
], { "collation" => { "locale" => "de@collation=phonebook" } }
)
aggregation.each do |doc|
#=> Yields a BSON::Document.
end

Volver

Almacene archivos grandes

En esta página