照合
項目一覧
Overview
このガイドでは、照合を使用して、クエリまたは集計操作の結果を string 値で並べ替える方法を学習できます。 照合は、特定の言語とロケールに適用される文字の順序付け規則のセットです。
MongoDB の照合
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 ドキュメント
このガイドで説明されているメソッドの詳細については、次の API ドキュメントを参照してください。