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
/

CRUD操作の構成

このガイドでは、 Goドライバーを使用して読み取りおよび書込み操作を構成する方法を学習できます。

読み込み設定 (read preference)を設定することで、ドライバーが読み取り操作をルーティングする方法を制御できます。また、読み取り保証 (read concern)または書込み保証 (write concern)を設定して、ドライバーがデータの整合性と耐久性を処理する方法を制御することもできます。読み取り保証 は読み取り操作を実行するときにデータに必要な耐久性のレベルを指定し、書込み保証 はレプリカセット内の書込み操作の確認をドライバーが待機する方法を指定します。

次のレベルで、書込み保証、読み取り保証、読み込み設定(read preference)のオプションを設定できます。

  • クライアント レベル。オーバーライドされない限り、すべての操作実行にデフォルトを設定します

  • セッション レベル

  • トランザクション レベル

  • データベース レベル

  • コレクション レベル

前のリストは、 オプション設定の優先順位の増加順も示しています。例、トランザクションに読み取り保証 (read concern)を設定すると、クライアントに設定された読み取り保証 (read concern)が上書きされます。

書込み保証 (write concern) は、挿入やアップデートなどの 書込み (write)操作を確認しなければならないレプリカセット内のデータを保持するノードの数を示します。その後、操作は成功として返されます。デフォルトでは 、プライマリレプリカセットノードのみが確認した場合、書込み操作は成功します。

MongoDB Goドライバーには writeconcernパッケージが提供されており、これを使用してレプリカセットの書込み保証 (write concern)を指定できます。WriteConcern 型のインスタンスを SetWriteConcern() メソッドに渡して書込み保証 (write concern)を設定します。WriteConcern タイプには、一般的な書込み保証 (write concern)の指定を選択するための次のメソッドが用意されています。

方式
説明

Custom()

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)

Journaled()

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

Majority()

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

Unacknowledged()

The client requests requests no acknowledgment of write operations. For more information, see the Write Concern specification for w: 0.

Parameter: none

W1()

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構造体で次のフィールドを設定できます。

フィールド
説明

W

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

Journal

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) レベルは "local" です。つまり、クライアントはインスタンスの最新データを返しますが、そのデータがレプリカセットのノードの過半数に書き込まれたことは保証されません。

MongoDB Go Driver は readconcernパッケージを提供しており、これを使用してレプリカセットの読み取り保証 (read concern)を指定できます。ReadConcern タイプのインスタンスを SetReadConcern() メソッドに渡して読み取り保証 (read concern)を設定します。ReadConcern タイプには、読み取り保証 (read concern)を指定するための次のメソッドがあります。

方式
説明

Available()

クエリはインスタンスからデータを返しますが、そのデータがレプリカセットのノードの大半に書き込まれたことを保証するものではありません。 詳細については、「読み取り保証 (read concern) 」の仕様を参照してください。

Linearizable()

クエリは、majority の書込み保証 (write concern)を使用して発行され、読み取り操作が開始される前に確認されたすべての成功した書き込みを反映したデータを返します。詳細については、「 読み取り保証 (read concern) 」の仕様を参照してください。

Local()

The query returns the instance’s most recent data. 詳細については、「読み取り保証 (read concern) 」の仕様を参照してください。

Majority()

このクエリは、レプリカセット内の過半数のノードに書き込まれたことが確認されたインスタンスの最新データを返します。 詳細については、「読み取り保証 (read concern) 」の仕様を参照してください。

Snapshot()

クエリでは、特定の点における mongodインスタンスのデータの完全なコピーが返されます。このオプションは、 マルチドキュメントトランザクション 内の操作でのみ使用できます。詳細については、「 読み取り保証 (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)オプションは、MongoDB クライアントが読み取り操作を レプリカセット のノードにルーティングする方法を指定します。 デフォルトでは、アプリケーションの読み取り操作は、 レプリカセット 内の プライマリ を対象に行われます。

読み込み設定 (read preference) は、読み込み設定 (read preference) モードと、オプションのタグセット リストmaxStalenessSecondsオプション、およびヘッジされた読み取りオプションで構成されています。

MongoDB Goドライバーには、レプリカセットの読み込み設定 (read preference)を指定できる readprefパッケージが用意されています。読み込み設定 (read preference)を設定するには、ReadPref 型のインスタンスをSetReadPreference() メソッドに渡します。ReadPref 型には、読み込み設定 (read preference)を指定するための次のメソッドがあります。

方式
説明

Nearest()

クライアントは、指定されたレイテンシのしきい値に基づいて、ランダムに選択された適格なレプリカセットメンバーから読み取ります。詳細については、読み込み設定 (read preference) サーバーのマニュアル エントリを参照してください。

Primary()

クライアントは、現在のレプリカセット プライマリ ノードから読み取ります。 詳細については、読み込み設定 (read preference) サーバーのマニュアル エントリを参照してください。

PrimaryPreferred()

プライマリノードが使用可能な場合、クライアントはそれから読み取ります。プライマリが使用できない場合、操作はセカンダリ ノードから読み取られます。詳細については、読み込み設定 (read preference) サーバーのマニュアル エントリを参照してください。

Secondary()

クライアントはレプリカセットの セカンダリ メンバーから読み取ります。 詳細については、読み込み設定 (read preference) サーバーのマニュアル エントリを参照してください。

SecondaryPreferred()

1 つ以上のセカンダリ ノードが使用可能な場合、クライアントはセカンダリ ノードから読み取ります。セカンダリが使用できない場合、操作はプライマリ ノードから読み取られます。詳細については、読み込み設定 (read preference) サーバーのマニュアル エントリを参照してください。

Tip

次のコードは、セカンダリ ノードから読み取るための読み込み設定 (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 ドキュメントを参照してください。

戻る

複合演算子