照合
照合は MongoDB 3.4 以降で利用可能です。
Overview
このガイドでは、ソート ルールのセットである照合を使用して、特定の言語とロケール(共通の言語言語を共有するコミュニティまたはリージョン)に対して string の順序付けを使用して操作を実行する方法を説明します。
MongoDBは、デフォルトでバイナリ照合を使用して string をソートします。この照合メソッドでは、 ASCII 標準 文字値を使用して文字列を比較して順序付けます。言語とロケールには、ASCII 標準とは異なる特定の文字順序付け規則があります。
たとえば、カナダフランス語では、他の文字が同じ場合、string の順序を決定します。 次のフランス語の単語について考えてみましょう。cote 、コテ、 cate 、 cotた 。
MongoDB は、デフォルトのバイナリ照合を使用して、これらを次の順序でソートします。
cote coté côte côté
MongoDB は、カナダ フランス語の照合を使用して、次の順序でソートします。
cote côte coté côté
使用法
新しいコレクションまたは新しいインデックスを作成するときに照合を指定できます。 また、 CRUD 操作と集計の照合を指定することもできます。
照合を使用して新しいコレクションを作成する場合、そのコレクションで呼び出される照合をサポートする操作のデフォルトの照合を定義します。 別の照合を指定することで、操作の照合を上書きできます。
注意
現在、既存のコレクションで照合を作成することはできません。 既存のコレクションで照合を使用するには、照合を含むインデックスを作成し、そのインデックスに対する操作で同じ照合を指定します。
照合を使用してインデックスを作成するときは、そのインデックスを使用する操作のソート順序を指定します。 インデックスで照合を使用するには、 操作で一致する照合を指定し、 操作でインデックスを使用する必要があります。 ほとんどのインデックス タイプは照合をサポートしていますが、次のタイプはバイナリ比較のみをサポートしています。
照合パラメータ
照合オブジェクトには、次のパラメーターが含まれています。
collation: { locale: <string>, caseLevel: <bool>, caseFirst: <string>, strength: <int>, numericOrdering: <bool>, alternate: <string>, maxVariable: <string>, backwards: <bool> }
照合で locale
フィールドを指定する必要があります。その他のフィールドはすべてオプションです。 サポートされているロケールとlocale
フィールドのデフォルト値の完全なリストについては、 「サポートされている言語とロケール」 を参照してください。 各フィールドの説明については、照合ドキュメント MongoDB のマニュアル エントリを参照してください。
照合の例
コレクションでのデフォルトの照合の設定
次の例では、 souvenirs
という新しいコレクションを作成し、 "fr_CA"
ロケールのデフォルトの照合を割り当てます。 照合は、そのコレクションで実行される照合をサポートするすべての操作に適用されます。
db.createCollection("souvenirs", { collation: { locale: "fr_CA" }, });
照合をサポートするいずれかの操作は、コレクションに定義された照合を自動的に適用します。 以下のクエリは、 souvenirs
コレクションを検索し、 "fr_CA"
ロケール照合を適用します。
myColl.find({type: "photograph"});
照合をサポートする操作では、パラメーターとして別の照合を指定できます。 次のクエリでは、 "is"
アイスランドのロケールとcaseFirst
の任意パラメータ を指定し、値は"upper"
とします。
myColl.find({type: "photograph"}, { collation: { locale: "is", caseFirst: "upper" } } );
インデックスへの照合の割り当て
次の例では、照合が"en_US"
ロケールに設定されているコレクションのtitle
フィールドに新しいインデックスを作成します。
myColl.createIndex( { 'title' : 1 }, { 'collation' : { 'locale' : 'en_US' } });
次のクエリは、作成したインデックスを使用します。
myColl.find({"year": 1980}, {"collation" : {"locale" : "en_US" }}) .sort({"title": -1});
次のクエリでは、作成したインデックスは使用されません。 最初のクエリには照合が含まれておらず、2 番目のクエリにはインデックスの照合とは異なる強度の値が含まれています。
myColl.find({"year": 1980}, {"collation" : {"locale" : "en_US", "strength": 2 }}) .sort({"title": -1});
myColl.find({"year": 1980}) .sort({"title": -1});
照合クエリの例
コレクションからドキュメントを読み取り、更新、削除する操作では、照合を使用できます。 このセクションでは、これらの選択の例を示します。 照合をサポートする操作の完全なリストについては、MongoDB マニュアルを参照してください。
find() と sort() の例
次の例では、デフォルトのバイナリ照合を使用するコレクションでfind()
とsort()
の両方を呼び出します。 locale
パラメータの値を"de"
に設定して、ジャーナル照合を使用します。
myColl.find({ city: "New York" }, { collation: { locale: "de" } }) .sort({ name: 1 });
findOneAndUpdate() の例
次の例では、デフォルトのバイナリ照合を使用するコレクションに対してfindOneAndUpdate()
操作を呼び出します。 コレクションには、次のドキュメントが含まれます。
{ "_id" : 1, "first_name" : "Hans" } { "_id" : 2, "first_name" : "Gunter" } { "_id" : 3, "first_name" : "Günter" } { "_id" : 4, "first_name" : "Jürgen" }
照合を指定していないこのコレクションに対する次のfindOneAndUpdate()
操作を検討してください。
myColl.findOneAndUpdate( { first_name : { $lt: "Gunter" } }, { $set: { verified: true } } );
バイナリ照合を使用する場合、「Gunter」は最初にソートされた結果であるため、クエリ ドキュメント内の$lt
比較演算子よりも句読点で一致するドキュメントはありません。 その結果、操作ではドキュメントは更新されません。
ロケールをde@collation=phonebook
に設定して照合を指定する同じ操作を検討してください。 このロケールでは、最初の文字を大文字にすることで識別される固有名を優先するためのルールを含むcollation=phonebook
オプションを指定します。 de@collation=phonebook
ロケールと オプションは、numlaut のない同じ文字の前に umelut を持つ文字をソートします 。
myColl.findOneAndUpdate( { first_name: { $lt: "Gunter" } }, { $set: { verified: true } }, { collation: { locale: "de@collation=phonebook" } }, );
findOneAndUpdate()
で指定されたde@collation=phonebook
照合を使用して、"Guter" が辞書的に "Gunter" より前に配置されるため、この操作は次の更新されたドキュメントを返します。
{ lastErrorObject: { updatedExisting: true, n: 1 }, value: { _id: 3, first_name: 'Günter' }, ok: 1 }
findOneAndDelete() の例
次の例では、デフォルトのバイナリ照合を使用し、次のドキュメントを含むコレクションに対してfindOneAndDelete()
操作を呼び出します。
{ "_id" : 1, "a" : "16" } { "_id" : 2, "a" : "84" } { "_id" : 3, "a" : "179" }
この例では、 numericOrdering
照合パラメータをtrue
に設定して、数字の string を辞書順ではなく番号順に基づいて並べ替えます。
myColl.findOneAndDelete( { a: { $gt: "100" } }, { collation: { locale: "en", numericOrdering: true } }, );
上記の操作を実行すると、 コレクションには次のドキュメントが含まれます。
{ "_id" : 1, "a" : "16" } { "_id" : 2, "a" : "84" }
3 つのドキュメントの元のコレクションに対して照合なしで同じ操作を実行すると、文字列の語彙値( "16"
、 "84"
、 "179"
)に基づいてドキュメントが照合され、最初に見つけたドキュメントが削除されます。クエリ条件に一致します。
await myColl.findOneAndDelete({ a: { $gt: "100" } });
すべてのドキュメントはa
フィールドに条件に一致する照合値( "100"
の句読点より大きい)が含まれているため、操作は最初の結果を削除します。 上記の操作を実行すると、 コレクションには次のドキュメントが含まれます。
{ "_id" : 2, "a" : "84" } { "_id" : 3, "a" : "179" }
集計の例
集計 と照合を使用するには 操作は、パイプライン ステージの配列の後にオプション フィールドに照合ドキュメントを渡します。
次の例では、デフォルトのバイナリ照合を使用するコレクションの集計パイプラインを示しています。 集計はfirst_name
フィールドをグループ化し、各グループの結果の合計数をカウントし、結果をドイツ語( "de@collation=phonebook"
ロケール)の順序でソートします。
注意
集計では1つの照合のみを指定できます。
myColl.aggregate( [ { $group: { "_id": "$first_name", "nameCount": { "$sum": 1 } } }, { $sort: { "_id": 1 } }, ], { collation: { locale: "de@collation=phonebook" } }, );