Docs Menu

Docs HomeGo

照合

項目一覧

  • Overview
  • MongoDB の照合
  • 照合の指定
  • コレクションまたはビューでの照合の設定
  • コレクションの作成例
  • デフォルトの照合例の使用
  • インデックスでの照合の設定
  • 操作での照合の設定
  • 詳細情報
  • API ドキュメント

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

MongoDB はデフォルトでバイナリ照合を使用して string をソートします。 この照合方法では、 ASCII 標準 を使用します 文字列を比較して順序付けるための文字値。特定の言語とロケールには、ASCII 標準とは異なる特定の文字順序付け規則があります。

たとえば、カナダフランス語では、他の文字が同じ場合、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"}

オブジェクト フィールドの完全なリストについては、 照合 API ドキュメント をご覧くださいCollation 。サポートされているすべてのロケールと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 {
fmt.Println(result)
}

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

[{name Cryptonomicon} {length 918}]
[{name Emma} {length 474}]

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)

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

インデックスの照合とは異なる操作に新しい照合を適用する場合、そのインデックスは使用できません。 その結果、操作は、インデックスによってカバーされる操作ほどパフォーマンスが良くない可能性があります。 インデックスで説明されていないソート操作の悪影響の詳細については、「クエリ結果をソートするためにインデックスを使用する」を参照してください。 照合をサポートする操作のリストについては、 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 {
fmt.Println(result)
}

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

[{name Emma} {length 474}]
[{name Cryptonomicon} {length 918}]

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

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

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

←  トランザクションGridFS →
フィードバックを送る
© 2022 MongoDB, Inc.

会社概要

© 2022 MongoDB, Inc.