Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Go Driver
/

照合

このガイドでは、照合を使用して、クエリまたは集計操作の結果を string 値で並べ替える方法を学習できます。 照合は、特定の言語とロケールに適用される文字の順序付け規則のセットです。

MongoDB sorts strings using binary collation by default. This collation method uses the ASCII standard character values to compare and order strings. Certain languages and locales have specific character ordering conventions that differ from the ASCII standard.

たとえば、カナダフランス語では、他の文字が同じ場合、string の順序を決定します。 次のカナダフランス語の単語について考えてみます。

  • コピー

  • coté

  • côte

  • côté

デフォルトのバイナリ照合を使用する場合、MongoDB はそれらを次の順序でソートします。

cote
coté
côte
côté

カナダ フランス語の照合を使用する場合、MongoDB はそれらを次の順序でソートします。

cote
côte
coté
côté

照合を指定するには、 Collationオブジェクトを作成します。 CollationオブジェクトのLocaleフィールドを定義する必要があります。その他のフィールドはすべてオプションです。 たとえば、次のコード例では、 "en_US"ロケール照合を持つCollationオブジェクトを指定します。

myCollation := &options.Collation{Locale: "en_US"}

Collationオブジェクトフィールドの完全なリストについては、 照合APIドキュメント をご覧ください。サポートされているすべてのロケールと フィールドのデフォルト値を確認するには、Locale 「サポートされている言語とロケール」 をご覧ください。

新しいコレクションまたはビューを作成するときに照合を適用できます。 これにより、そのコレクションまたはビューで呼び出される操作のデフォルトの照合方法が定義されます。 CreateCollectionOptionsまたはCreateViewOptionsオブジェクトを介して照合を設定します。 次に、オプション オブジェクトを引数としてCreateCollection()またはCreateView()メソッドを呼び出します。

次の例では、 booksという新しいコレクションを作成し、 "fr"ロケールでデフォルトの照合を指定しています。 Strength照合フィールドには、文字のアクセントの違いを無視するための1の値があります。

myCollation := &options.Collation{Locale: "fr", Strength: 1}
opts := options.CreateCollection().SetCollation(myCollation)
err := db.CreateCollection(context.TODO(), "books", opts)
if err != nil {
panic(err)
}

booksコレクションで照合を使用する操作を呼び出すと、操作はコレクションの作成例 で指定されたデフォルトの照合を使用します。

booksコレクションには次のドキュメントが含まれているとします。

{"name" : "Emma", "length" : "474"}
{"name" : "Les Misérables", "length": "1462"}
{"name" : "Infinite Jest", "length" : "1104"}
{"name" : "Cryptonomicon", "length" : "918"}
{"name" : "Ça", "length" : "1138"}

注意

ドキュメントを挿入する方法については、「 ドキュメントの挿入 」を参照してください

次の例では、 Find()メソッドを使用して、 "Infinite Jest"のアルファベット順に先行するname値を持つすべてのドキュメントを返します。

filter := bson.D{{"name", bson.D{{"$lt", "Infinite Jest"}}}}
cursor, err := coll.Find(context.TODO(), filter)
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}
{"name":"Emma","length":"474"}
{"name":"Cryptonomicon","length":"918"}
{"name":"Ça","length":"1138"}

デフォルトのbooks照合を指定しない場合、 Find()メソッドはデフォルトのバイナリ照合ルールに従って、 "Infinite Jest"に先行するname値を決定します。 これらのルールでは、"$" で始まる単語が、"I" で始まる単語の後に配置されます。 出力は、次のようになります。

{"name":"Emma","length":"474"}
{"name":"Cryptonomicon","length":"918"}

Find()メソッドの詳細については、「データの取得 」を参照してください。

コレクションに新しいインデックスを作成するときに、照合を適用できます。 インデックスはコレクション内のドキュメントの順序付けられた表現を保存するため、MongoDB インスタンスはメモリ内でソート操作の順序付けを実行しません。

操作でインデックスを使用するには、インデックスで指定された照合と同じ照合を使用する必要があります。 さらに、操作が照合を含むインデックスでカバーされていることを確認してください。 IndexOptionsオブジェクトを通じて照合を設定し、このオブジェクトをCreateOne()メソッドの引数として渡します。

コレクションの作成例 」セクションに示されているように、 booksコレクションを作成し、デフォルトの照合を適用した後は、コレクションのデフォルトの照合を変更できません。 ただし、別の照合を持つコレクションのインデックスを作成することはできます。

次の例では、 CreateOne()メソッドを使用してnameフィールドに昇順のインデックスを作成し、 "en_US"ロケールで新しい照合を指定します。

myCollation := &options.Collation{Locale: "en_US"}
opts := options.Index().SetCollation(myCollation)
indexModel := mongo.IndexModel{
Keys: bson.D{{"name", 1}},
Options: opts,
}
name, err := coll.Indexes().CreateOne(context.TODO(), indexModel)
if err != nil {
panic(err)
}
fmt.Println("Name of Index Created: " + name)
Name of Index Created: name_1

コレクションからドキュメントを読み取り、更新、削除する操作では、照合を使用できます。 操作に照合を適用すると、コレクションに対して以前に定義されたデフォルトの照合は上書きされます。

インデックスの照合とは異なる操作に新しい照合を適用する場合、そのインデックスは使用できません。 その結果、操作は、インデックスによってカバーされる操作ほどパフォーマンスが良くない可能性があります。 インデックスで説明されていないソート操作の悪影響の詳細については、「クエリ結果をソートするためにインデックスを使用する」を参照してください。 照合をサポートする操作のリストについては、 MongoDB マニュアルを参照してください。

照合をサポートする操作を使用して、 booksコレクション内のドキュメントを更新およびクエリできます。

次の例では、 Find()メソッドを使用して、 lengthの値が"1000"より大きいドキュメントを返します。 NumericOrdering照合フィールドにはtrueの値があり、値がアルファベット順ではなく番号順でソートされるようにします。

filter := bson.D{{"length", bson.D{{"$gt", "1000"}}}}
myCollation := &options.Collation{Locale: "en_US", NumericOrdering: true}
opts := options.Find().SetCollation(myCollation)
cursor, err := coll.Find(context.TODO(), filter, opts)
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}
{"name":"Les Misérables","length":"1462"}
{"name":"Infinite Jest","length":"1104"}
{"name":"Ça","length":"1138"}

NumericOrderingフィールドをtrueに設定して照合を指定しない場合、同じFind()操作でlength値が string として比較されます。 この場合、出力は次のようになります。

{"name":"Emma","length":"474"}
{"name":"Les Misérables","length":"1462"}
{""name":"Infinite Jest","length":"1104"}
{"name":"Cryptonomicon","length":"918"}
{"name":"Ça","length":"1138"}

Find()メソッドの詳細については、「データの取得」ガイドを参照してください。

照合の詳細については、次のマニュアル ページを参照してください。

このガイドで説明されているメソッドの詳細については、次の API ドキュメントを参照してください。

戻る

コマンドの実行

項目一覧