照合は、スペイン語やドイツなどの特定の言語の規則に準拠する string を比較するときに使用するルールのセットを提供します。 照合が指定されていない場合、サーバーはバイナリ比較に基づいてstringをソートします。 ただし、多くの言語には特定の順序付けルールと照合順序があるため、ユーザーはこれらのルールに準拠したアプリケーションをビルドできます。
たとえば、フランス語では、特定の単語の最後のアクセントによって並べ替え順序が決まります。 次の例では、フランス語の 4 単語の正しいソート順序を示しています。
cote < côte < coté < côté
フランス語の照合を指定すると、ユーザーはフランス語のソート順序で string フィールドをソートできるようになります。
使用法
コレクション、インデックス、またはCRUD コマンドの照合順序を指定できます。
照合パラメータ:
照合を指定するには、 ~pymongo.collation.Collationモデルまたは Python 辞書 を使用します。 どちらの場合も、構造は同じです。
Collation(locale=<string>, caseLevel=<bool>, caseFirst=<string>, strength=<int>, numericOrdering=<bool>, alternate=<string>, maxVariable=<string>, backwards=<bool>)
必要なパラメータはlocaleのみです。サーバーはこれをICU 形式のロケール IDとして解析します。 たとえば、米国英語を表す場合はlocaleをen_USに設定し、カナダフランス語を表す場合はfr_CAを設定します。
コレクションへのデフォルトの照合の割り当て
次の例では、 contactsという新しいコレクションを作成し、 fr_CAロケールでデフォルトの照合を割り当てる方法を示します。 この操作により、別の照合が明示的に指定されていない限り、 contactsコレクションに対して実行されるすべてのクエリでfr_CA照合が使用されるようになります。
from pymongo import MongoClient from pymongo.collation import Collation db = MongoClient().test collection = db.create_collection('contacts', collation=Collation(locale='fr_CA'))
インデックスへのデフォルト照合の割り当て
新しいインデックスを作成するときに、デフォルトの照合を指定できます。
次の例は、 contactsコレクションのnameフィールドにインデックスを作成する方法を示しています。 uniqueパラメータは有効になっており、 localeは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'))
クエリの照合の指定
クエリは、結果をソートするときに使用する照合を指定できます。 次の例では、 testデータベース内のcontactsコレクションに対して実行されるクエリを示します。 cityフィールドにNew Yorkを含むドキュメントに一致し、 nameフィールドでは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'))
その他のクエリ タイプ
照合を使用すると、いくつかの異なるタイプのクエリのドキュメント一致ルールを制御できます。 アップデート操作または削除操作を実行するすべてのメソッドは照合をサポートしており、 localeパラメータで使用可能な言語とバリアントのいずれかに準拠するために、照合を使用するクエリフィルターを作成できます。
次の例では、 strengthを~pymongo.collation.CollationStrength.SECONDARYに設定して照合を使用します。これでは、string 比較における基本文字と文字のアクセントのみが考慮されますが、大文字と小文字の区別はありません。 first_nameフィールドにjürgen (大文字と小文字を区別しない)を持つcontactsコレクション内のすべてのドキュメントが更新されます。
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))