Agrupamentos
Novidade na versão 3.4.
O agrupamento permite que os usuários especifiquem regras específicas do idioma para comparação de strings, como regras para letras maiúsculas e acentos.
Você pode especificar o agrupamento para uma coleta ou uma visualização, um índice ou operações específicas que suportam o agrupamento.
Para especificar o agrupamento quando você faz uma query de documentos na IU do MongoDB Atlas, consulte a página Especificar agrupamento.
Documento de agrupamento
Um documento de agrupamento tem os seguintes campos:
{ locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> }
Ao especificar agrupamentos, o campo locale
é obrigatório; todos os outros campos de agrupamento são opcionais. Para obter descrições dos campos, consulte Documento de agrupamento.
Os valores padrão dos parâmetros de agrupamento variam de acordo com a localidade que você especificar. Para obter uma lista completa dos parâmetros de agrupamento padrão e dos locais aos quais eles estão associados, consulte Parâmetros padrão de agrupamento.
Campo | Tipo | Descrição | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
locale | string | O local da UTI. Consulte Idiomas e localidades compatíveis para obter uma lista das localidades suportadas. Para especificar uma comparação binária simples, especifique | ||||||||||||
strength | inteiro | Opcional. O nível de comparação a ser executado. Corresponde aos níveis de comparação da UTI. Os valores possíveis são:
Consulte Agrupamento de ICU: Níveis de Comparação para detalhes. | ||||||||||||
caseLevel | booleano | Opcional. Sinalizador que determina se a comparação de caso deve ser incluída no nível Se
Se Para obter mais informações, consulte Agrupamento do ICU: nível de caso. | ||||||||||||
caseFirst | string | Opcional. Um campo que determina a ordem de classificação das diferenças entre maiúsculas e minúsculas durante comparações de nível terciário. Os valores possíveis são:
| ||||||||||||
numericOrdering | booleano | Opcional. Sinalizador que determina se as strings numéricas devem ser comparadas como números ou como strings. Se Se O padrão é Consulte Restrições de NumericOrdering. | ||||||||||||
alternate | string | Opcional. Campo que determina se o agrupamento deve considerar espaços em branco e pontuação como caracteres base para fins de comparação. Os valores possíveis são:
Consulte Agrupamento de ICU: Níveis de Comparação para obter mais informações. O padrão é | ||||||||||||
maxVariable | string | Opcional. Campo que determina até quais caracteres são considerados ignoráveis quando Os valores possíveis são:
| ||||||||||||
backwards | booleano | Opcional. Bandeira que determina se as cadeias com sinais diacríticos são classificadas de trás da string, como com alguns pedidos no dicionário francês. Se Se O valor padrão é | ||||||||||||
normalization | booleano | Opcional. Sinalizador que determina se é necessário verificar se o texto requer normalização e para realizar a normalização. Geralmente, a maioria dos textos não exige esse processamento de normalização. Se Se O valor padrão é Consulte https://unicode-org.github.io/icu/userguide/collation/concepts.html#normalization para obter detalhes. |
Operações que suportam agrupamento
Você pode especificar agrupamento para as seguintes operações:
Observação
Você não pode especificar vários agrupamentos para uma operação. Por exemplo, você não pode especificar agrupamentos diferentes por campo ou, se estiver realizando uma busca com uma classificação, não poderá usar um agrupamento para a busca e outro para a classificação.
Comandos | mongosh Métodos |
---|---|
cursor.collation() para especificar agrupamento para
db.collection.find() | |
Operações individuais de atualização, substituição e exclusão em db.collection.bulkWrite() . |
[1] | (1, 2) Alguns tipos de índice não suportam agrupamentos. Consulte a página Agrupamento e tipos de índice não suportados para obter detalhes. |
Comportamento
Variantes locais
Algumas localidades de agrupamento têm variantes, que empregam regras especiais específicas de idioma. Para especificar uma variante de localidade, use a seguinte sintaxe:
{ "locale" : "<locale code>@collation=<variant>" }
Por exemplo, para usar a variante unihan
do agrupamento chinês:
{ "locale" : "zh@collation=unihan" }
Para obter uma lista completa de todas as localidades de agrupamento e suas variantes, consulte Localidades de agrupamento.
Agrupamentos e visualizações
Você pode especificar um agrupamento padrão para uma visualização no momento da criação. Se nenhum agrupamento for especificado, o agrupamento padrão da visualização será o coletor de comparação binária "simples". Ou seja, a visualização não herda o agrupamento padrão da collection.
As comparações de strings na visualização usam o agrupamento padrão da visualização. Uma operação que tenta alterar ou substituir a coleta padrão de uma visualização falhará com um erro.
Se estiver criando um modo de exibição a partir de outro modo de exibição, você não poderá especificar um agrupamento que difere do agrupamento do modo de exibição de origem.
Se executar uma agregação que envolve múltiplas visualizações, como com
$lookup
ou$graphLookup
, as visualizações deverão ter o mesmo agrupamento.
Agrupamento e uso do índice
Para usar um índice para comparações de strings, uma operação também deve especificar o mesmo agrupamento. Ou seja, um índice com ordenação não pode suportar uma operação que executa comparações de strings nos campos indexados se a operação especificar uma ordenação diferente.
Aviso
Porque os índices configurados com agrupamento usam ICU. chaves de agrupamento para obter a ordem de classificação, chaves de índice com reconhecimento de agrupamento pode ser maior do que as chaves de índice para índices sem agrupamento.
Por exemplo, a coleta myColl
possui um índice em um campo de sequência category
com o código do idioma de ordenação "fr"
.
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
A seguinte operação de consulta, que especifica o mesmo agrupamento que o índice, pode usar o índice:
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
No entanto, a seguinte operação de consulta, que por padrão usa o agrupador binário "simples", não pode usar o índice:
db.myColl.find( { category: "cafe" } )
Para um índice composto em que as chaves de prefixo do índice não são strings, matrizes e documentos incorporados, uma operação que especifica um agrupamento diferente ainda pode usar o índice para dar suporte a comparações nas chaves de prefixo do índice.
Por exemplo, a coleta myColl
possui um índice composto nos campos numéricos score
e price
e no campo de string category
; o índice é criado com a localidade de ordenação "fr"
para comparações de strings:
db.myColl.createIndex( { score: 1, price: 1, category: 1 }, { collation: { locale: "fr" } } )
As operações a seguir, que usam agrupamento binário "simple"
para comparações de strings, podem usar o índice:
db.myColl.find( { score: 5 } ).sort( { price: 1 } ) db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
A operação a seguir, que usa agrupamento binário "simple"
para comparações de strings no campo category
indexado, pode usar o índice para preencher apenas a parte score: 5
da query:
db.myColl.find( { score: 5, category: "cafe" } )
Importante
As correspondências com chaves de documento, incluindo as chaves de documentos incorporados, usam uma comparação binária simples. Isso significa que uma query de uma chave como "foo.bár" não corresponderá à chave "foo.bar", independente do valor definido para o parâmetro de força.
Agrupamento e tipos de índice não suportados
Os índices a seguir oferecem suporte apenas à comparação binária simples e não oferecem suporte ao agrupamento:
índices de texto ,
Índices 2d e
índices do geoHaystack .
Dica
Para criar um índice text
, 2d
ou um índice geoHaystack
em uma collection que tem um agrupamento não simples, você deve especificar explicitamente {collation: {locale: "simple"} }
ao criar o índice.
Restrições
numericOrdering
Ao especificar numericOrdering
como true
as seguintes restrições se aplicam:
Somente substrings contíguos de números inteiros não negativos são considerados nas comparações.
numericOrdering
não suporta:+
-
separadores decimais, como pontos decimais e vírgulas decimais
expoentes
Somente pontos de código Unicode na categoria Número ou Dígito Decimal (Nd) são tratados como dígitos.
Se o comprimento de um dígito exceder 254 caracteres, o excesso de caracteres será tratado como um número separado.
Considere uma coleta com o seguinte número de string e valores decimais:
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" } ] )
A query find
a seguir usa um documento de agrupamento que contém o parâmetro numericOrdering
:
db.c.find( { }, { _id: 0 } ).sort( { n: 1 } ).collation( { locale: 'en_US', numericOrdering: true } )
A operação retorna os seguintes 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
ordenar os valores da string em ordem crescente como se fossem valores numéricos.Os dois valores negativos
-2.1
e-10
não são classificados na ordem de classificação esperada porque têm-
caracteres não suportados.O valor
2.2
é classificado antes do valor2.10
, devido ao fato de que o parâmetronumericOrdering
não suporta valores decimais.Como resultado,
2.2
e2.10
são ordenados em ordem lexicográfica.