Overview
このガイドでは、 Goドライバーを使用して読み取りおよび書込み操作を構成する方法を学習できます。
読み取り設定と書込み設定
読み込み設定 (read preference)を設定することで、ドライバーが読み取り操作をルーティングする方法を制御できます。また、読み取り保証 (read concern)または書込み保証 (write concern)を設定して、ドライバーがデータの整合性と耐久性を処理する方法を制御することもできます。読み取り保証 は読み取り操作を実行するときにデータに必要な耐久性のレベルを指定し、書込み保証 はレプリカセット内の書込み操作の確認をドライバーが待機する方法を指定します。
次のレベルで、書込み保証、読み取り保証、読み込み設定(read preference)のオプションを設定できます。
クライアント レベル。オーバーライドされない限り、すべての操作実行にデフォルトを設定します
セッション レベル
トランザクション レベル
データベース レベル
コレクション レベル
前のリストは、 オプション設定の優先順位の増加順も示しています。例、トランザクションに読み取り保証 (read concern)を設定すると、クライアントに設定された読み取り保証 (read concern)が上書きされます。
書込み保証 (write concern)
書込み保証 (write concern) は、挿入やアップデートなどの 書込み (write)操作を確認しなければならないレプリカセット内のデータを保持するノードの数を示します。その後、操作は成功として返されます。デフォルトでは 、プライマリレプリカセットノードのみが確認した場合、書込み操作は成功します。
オプション
MongoDB Goドライバーには writeconcern
パッケージが提供されており、これを使用してレプリカセットの書込み保証 (write concern)を指定できます。WriteConcern
型のインスタンスを SetWriteConcern()
メソッドに渡して書込み保証 (write concern)を設定します。WriteConcern
タイプには、一般的な書込み保証 (write concern)の指定を選択するための次のメソッドが用意されています。
方式 | 説明 |
---|---|
| The client requests acknowledgement that write operations propagate to
tagged members of a mongod instance. For more
information, see the Write Concern specification.Parameter: tag (string) |
| The client requests acknowledgement that the replica set has
written the changes to the on-disk journal. For more information, see the
Write Concern specification. Parameter: none |
| The client requests acknowledgement that write operations propagate to the
majority of data-bearing voting members. For more information, see the
Write Concern specification. Parameter: none |
| The client requests requests no acknowledgment of write
operations. For more information, see the
Write Concern specification for w: 0. Parameter: none |
| The client requests acknowledgement that the replica set has
written the changes to memory on one node, such as the standalone mongod or
the primary in a replica set. For more
information, see the Write Concern specification for w: 1. Parameter: none |
Tip
書込み保証 (write concern) タイムアウト
WriteConcern
インスタンスではタイムアウトを設定できません。代わりに、Context の作成時に WithTimeout()
メソッドを使用して操作レベルでタイムアウトを設定します。詳しくは、接続オプションガイドの サーバー実行時間の制限 を参照してください。
より特殊な書込み保証が必要な場合は、カスタムWriteConcern
構造体リテラルを定義できます。 WriteConcern
構造体で次のフィールドを設定できます。
フィールド | 説明 |
---|---|
| Specifies the number of mongod instances or tagged members
that write operations must propagate to for acknowledgement. Common values include
1 , 0 , and "majority" .Type: string or int |
| Specifies whether the replica set must write the changes to the on-disk
journal for acknowledgement. Type: bool |
Tip
あるいは、接続文字列で書込み保証 (write concern)を指定することもできます。 詳細については、書込み保証(write concern)オプションに関するサーバーのマニュアル エントリを参照してください。
例
次のコードは、クライアントとコレクションレベルで異なる書込み保証を指定する方法を示しています。クライアントレベルの書込み保証 (write concern)は、2 つのレプリカセットノードからの確認を要求し、ジャーナリングを false
に設定します。コレクションレベルの書込み保証 (write concern)は、レプリカセットノードの過半数からの確認応答を要求します。
uri := "mongodb://<hostname>:<port>" journal := false cliWC := &writeconcern.WriteConcern{ W: 2, Journal: &journal, } clOpts := options.Client().ApplyURI(uri).SetWriteConcern(cliWC) client, err := mongo.Connect(clOpts) ... collWC := writeconcern.Majority() collOpts := options.Collection().SetWriteConcern(collWC) coll := client.Database("db").Collection("myColl", collOpts)
読み取り保証(read concern)
読み取り保証(read concern)オプションを使用すると、クライアントがクエリから返すデータを決定できます。 デフォルトの読み取り保証 (read concern) レベルは "local" です。つまり、クライアントはインスタンスの最新データを返しますが、そのデータがレプリカセットのノードの過半数に書き込まれたことは保証されません。
オプション
MongoDB Go Driver は readconcern
パッケージを提供しており、これを使用してレプリカセットの読み取り保証 (read concern)を指定できます。ReadConcern
タイプのインスタンスを SetReadConcern()
メソッドに渡して読み取り保証 (read concern)を設定します。ReadConcern
タイプには、読み取り保証 (read concern)を指定するための次のメソッドがあります。
方式 | 説明 |
---|---|
| クエリはインスタンスからデータを返しますが、そのデータがレプリカセットのノードの大半に書き込まれたことを保証するものではありません。 詳細については、「読み取り保証 (read concern) 」の仕様を参照してください。 |
| クエリは、 |
| The query returns the instance’s most recent data. 詳細については、「読み取り保証 (read concern) 」の仕様を参照してください。 |
| このクエリは、レプリカセット内の過半数のノードに書き込まれたことが確認されたインスタンスの最新データを返します。 詳細については、「読み取り保証 (read concern) 」の仕様を参照してください。 |
| クエリでは、特定の点における |
例
次のコードは、「majority」の読み取り保証(read concern)を指定する方法を示しています。 次に、コードはこのオプションを持つCollection
を選択します。
rc := readconcern.Majority() opts := options.Collection().SetReadConcern(rc) database := client.Database("db") coll := database.Collection("myCollection", opts)
読み込み設定 (read preference)
読み込み設定(read preference)オプションは、MongoDB クライアントが読み取り操作を レプリカセット のノードにルーティングする方法を指定します。 デフォルトでは、アプリケーションの読み取り操作は、 レプリカセット 内の プライマリ を対象に行われます。
読み込み設定 (read preference) は、読み込み設定 (read preference) モードと、オプションのタグセット リスト、 maxStalenessSecondsオプション、およびヘッジされた読み取りオプションで構成されています。
オプション
MongoDB Goドライバーには、レプリカセットの読み込み設定 (read preference)を指定できる readpref
パッケージが用意されています。読み込み設定 (read preference)を設定するには、ReadPref
型のインスタンスをSetReadPreference()
メソッドに渡します。ReadPref
型には、読み込み設定 (read preference)を指定するための次のメソッドがあります。
方式 | 説明 |
---|---|
| クライアントは、指定されたレイテンシのしきい値に基づいて、ランダムに選択された適格なレプリカセットメンバーから読み取ります。詳細については、読み込み設定 (read preference) サーバーのマニュアル エントリを参照してください。 |
| クライアントは、現在のレプリカセット プライマリ ノードから読み取ります。 詳細については、読み込み設定 (read preference) サーバーのマニュアル エントリを参照してください。 |
| プライマリノードが使用可能な場合、クライアントはそれから読み取ります。プライマリが使用できない場合、操作はセカンダリ ノードから読み取られます。詳細については、読み込み設定 (read preference) サーバーのマニュアル エントリを参照してください。 |
| クライアントはレプリカセットの セカンダリ メンバーから読み取ります。 詳細については、読み込み設定 (read preference) サーバーのマニュアル エントリを参照してください。 |
| 1 つ以上のセカンダリ ノードが使用可能な場合、クライアントはセカンダリ ノードから読み取ります。セカンダリが使用できない場合、操作はプライマリ ノードから読み取られます。詳細については、読み込み設定 (read preference) サーバーのマニュアル エントリを参照してください。 |
Tip
あるいは、接続文字列で読み込み設定 (read preference)を指定することもできます。 詳細については、サーバー マニュアルの「 読み込み設定(read preference)オプション 」に関する記述を参照してください。
例
次のコードは、セカンダリ ノードから読み取るための読み込み設定 (read preference) を指定する方法を示しています。 次に、コードはこのオプションを持つDatabase
を選択します。
rp := readpref.Secondary() opts := options.Database().SetReadPreference(rp) database := client.Database("db", opts)
再試行可能な読み取りと書込み
Goドライバーは、ネットワークまたはサーバーエラーにより失敗した場合、特定の読み取りおよび書き込み操作を 1 回自動的に再試行します。
新しいクライアントを作成するときに、options.Client
構造体を使用して RetryReads
または RetryWrites
オプションを False
に設定することで、再試行可能な読み取りまたは再試行可能な書込みを明示的に無効にすることができます。
次の例では、ClientOptions
セッター関数を使用して、クライアントの再試行可能な読み取りと書込みを無効にします。
// Defines the client options clientOps := options.Client(). ApplyURI(uri). SetRetryWrites(false). SetRetryReads(false) // Creates a new client using the specified options client, err := mongo.Connect(clientOps) if err != nil { panic(err) }
サポートされている再試行可能な読み取り操作の詳細については、 MongoDB Serverマニュアルの「 再試行可能な読み取り 」を参照してください。サポートされている再試行可能な書込み操作の詳細については、 MongoDB Serverマニュアルの「 再試行可能な書込み 」を参照してください。
照合
照合を指定して、読み取り操作と書込み操作の動作を変更できます。照合は、大文字と小文字やアクセント記号など、string を比較するための言語固有のルールのセットです。
デフォルトでは 、 MongoDB はバイナリ照合を使用して string をソートします。このデフォルトの照合では、ASCII 標準 文字値を使用して string を比較および順序付けます。言語とロケールには ASCII 標準とは異なる特定の文字順序付け規則があり、別の照合ルールのセットを操作に適用することを選択できます。
照合は、次のレベルで指定できます。
コレクション:コレクションに対する操作のデフォルトの照合 を設定します。既存のコレクションに対して照合を定義することはできません。
インデックス:インデックスを使用する操作の 照合 を設定します。
操作: 操作の照合を設定し、継承された照合を上書きします。
照合の指定
照合を指定するには、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 { 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 ドキュメント
このガイドで説明されているメソッドの詳細については、次の API ドキュメントを参照してください。