Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/

Agrupamentos

Nesta página

  • Documento de agrupamento
  • Operações que suportam agrupamento
  • Comportamento
  • Restrições

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.

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 locale valor de "simple".

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:

Valor
Descrição
1
Nível primário de comparação. O agrupamento realiza comparação apenas dos caracteres básicos, ignorando outras diferenças, como diacríticos, maiúsculas e minúsculas.
2
Nível secundário de comparação. O agrupamento realiza comparações até diferenças secundárias, como diacríticos. Ou seja, o agrupamento realiza comparações de caracteres básicos (diferenças primárias) e sinais diacríticos (diferenças secundárias). As diferenças entre caracteres básicos têm precedência sobre diferença secundária.
3

Nível terciário de comparação. O agrupamento realiza comparações até diferenças terciárias, como variantes de maiúsculas e minúsculas. Ou seja, o agrupamento realiza comparações de caracteres básicos (diferenças primárias), diacríticos (diferenças secundárias) e caso e variantes (diferenças terciárias). Diferenças entre caracteres básicos tem precedência sobre diferenças secundárias, que tem precedência sobre as diferenças terciárias.

Este é o nível padrão.

4
Nível quaternário. Limitado para casos de uso específicos para considerar a pontuação quando os níveis 1-3 ignoram a pontuação ou para processar texto em japonês.
5
Nível idêntico. Limitado para casos de uso específicos do disjuntor tie .

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 strength 1 ou 2.

Se true, inclua comparação de caso:

  • Quando usado com strength:1, o agrupamento compara caracteres básicos e maiúsculas e minúsculas.

  • Quando usado com strength:2, o agrupamento compara caracteres básicos, diacríticos (e outras possíveis diferenças secundárias) e maiúsculas e minúsculas.

Se false, não inclua comparação de caso no nível 1 ou 2. O padrão é false.

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:

Valor
Descrição
"upper"
As maiúsculas são classificadas antes das minúsculas.
"lower"
As minúsculas são classificadas antes das maiúsculas.
"off"
Valor padrão. Semelhante a "lower" com pequenas diferenças. Consulte a página https://unicode-org.github.io/icu/userguide/strings/properties.html#customization para ver um detalhamento das diferenças.
numericOrdering
booleano

Opcional. Sinalizador que determina se as strings numéricas devem ser comparadas como números ou como strings.

Se true, compare como números. Por exemplo, "10" é maior que "2".

Se false, compare como strings. Por exemplo, "10" é menor que "2".

O padrão é false.

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:

Valor
Descrição
"non-ignorable"
Espaço em branco e pontuação são considerados caracteres básicos.
"shifted"
Espaço em branco e pontuação não são considerados caracteres base e só se distinguem em níveis de força superiores a 3.

Consulte Agrupamento de ICU: Níveis de Comparação para obter mais informações.

O padrão é "non-ignorable".

maxVariable
string

Opcional. Campo que determina até quais caracteres são considerados ignoráveis quando alternate: "shifted". Não tem efeito se alternate: "non-ignorable"

Os valores possíveis são:

Valor
Descrição
"punct"
Tanto o espaço em branco quanto a pontuação são ignoráveis e são considerados caracteres básicos.
"space"
Os espaços em branco são ignoráveis e não são considerados caracteres básicos .
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 true, compare de trás para frente.

Se false, compare de frente para trás.

O valor padrão é false.

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 true, verifique se está totalmente normalizado e realize normalização para comparar o texto.

Se false, não verifica.

O valor padrão é false.

Consulte https://unicode-org.github.io/icu/userguide/collation/concepts.html#normalization para obter detalhes.

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.

[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.

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.

  • 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.

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.

Os índices a seguir oferecem suporte apenas à comparação binária simples e não oferecem suporte ao agrupamento:

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.

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 valor 2.10, devido ao fato de que o parâmetro numericOrdering não suporta valores decimais.

  • Como resultado, 2.2 e 2.10 são ordenados em ordem lexicográfica.

Voltar

Referência