Os agrupamentos fornecem um conjunto de regras a serem usadas ao comparar strings que cumprem as convenções de um idioma específico, como espanhol ou alemão. Se nenhum agrupamento for especificado, o servidor classificará as strings com base em uma comparação binária. No entanto, muitos idiomas têm regras de ordenação específicas, e agrupamentos permitem que os usuários criem aplicativos que sigam essas regras.
Em francês, por exemplo, o último acento em uma determinada palavra determina a ordem de classificação. O exemplo a seguir mostra a ordem de classificação correta para quatro palavras em francês:
cote < côte < coté < côté
A especificação de um agrupamento em francês permite que os usuários classifiquem os campos de string usando a ordem de classificação em francês.
Uso
Você pode especificar um agrupamento para umacoleção , um índice ou um comando CRUD.
Parâmetros de agrupamento:
Você pode especificar um agrupamento utilizando o modelo ~pymongo.collation.Collation
ou dicionários Python. Em ambos os casos, a estrutura é a mesma:
Collation(locale=<string>, caseLevel=<bool>, caseFirst=<string>, strength=<int>, numericOrdering=<bool>, alternate=<string>, maxVariable=<string>, backwards=<bool>)
O único parâmetro exigido é locale
, que o servidor analisa como um ID de locale no formato ICU. Por exemplo, defina locale
como en_US
para representar o inglês dos EUA ou fr_CA
para representar o francês canadense.
Atribuir um agrupamento padrão a uma collection
O exemplo a seguir demonstra como criar uma nova coleção chamada contacts
e atribuir um agrupamento padrão com a locale fr_CA
. Essa operação garante que todas as queries executadas na collection contacts
usem o agrupamento fr_CA
, a menos que outro agrupamento seja explicitamente especificado.
from pymongo import MongoClient from pymongo.collation import Collation db = MongoClient().test collection = db.create_collection('contacts', collation=Collation(locale='fr_CA'))
Atribuir um agrupamento padrão a um índice
Ao criar um novo índice, você pode especificar um agrupamento padrão.
O exemplo a seguir mostra como criar um índice no campo name
da collection contacts
, com o parâmetro unique
habilitado e um agrupamento padrão com locale
definido como fr_CA
.
from pymongo import MongoClient from pymongo.collation import Collation contacts = MongoClient().test.contacts contacts.create_index('name', unique=True, collation=Collation(locale='fr_CA'))
Especifique um agrupamento para uma query
Uma query pode especificar um agrupamento a ser usado ao classificar os resultados. O exemplo seguinte demonstra uma query que é executada na collection contacts
no banco de dados de dados test
. Ele corresponde a documentos que contêm New York
no campo city
e classifica no campo name
com o agrupamento fr_CA
.
from pymongo import MongoClient from pymongo.collation import Collation collection = MongoClient().test.contacts docs = collection.find({'city': 'New York'}).sort('name').collation( Collation(locale='fr_CA'))
Outros tipos de query
Você pode usar agrupamentos para controlar regras de correspondência de documentos para vários tipos diferentes de consultas. Todos os métodos que executam operações de atualização ou exclusão suportam agrupamento, e você pode criar filtros de consulta que usam agrupamento para cumprir qualquer um dos idiomas e variantes disponíveis para o parâmetro locale
.
O exemplo a seguir usa um agrupamento com strength
definido como ~pymongo.collation.CollationStrength.SECONDARY
, que considera apenas o caractere base e os acentos de caracteres em comparações de string , mas não a distinção entre maiúsculas e minúsculas, por exemplo. Todos os documentos na coleção contacts
com jürgen
(diferencia maiúsculas de minúsculas) no campo first_name
são atualizados.
from pymongo import MongoClient from pymongo.collation import Collation, CollationStrength contacts = MongoClient().test.contacts result = contacts.update_many( {'first_name': 'jürgen'}, {'$set': {'verified': 1}}, collation=Collation(locale='de', strength=CollationStrength.SECONDARY))