一括操作
項目一覧
Overview
このガイドでは、一括操作の使用方法を学習できます。
一括操作は、多数の書込み操作を実行します。 一括操作では、操作ごとにデータベースへの呼び出しを行う代わりに、データベースへの 1 回の呼び出しで複数の操作を実行します。
サンプル データ
このガイドの例を実行するには、次のスニペットを使用してサンプルデータを tea.ratings
コレクションにロードします。
coll := client.Database("tea").Collection("ratings") docs := []interface{}{ bson.D{{"type", "Masala"}, {"rating", 10}}, bson.D{{"type", "Earl Grey"}, {"rating", 5}}, } result, err := coll.InsertMany(context.TODO(), docs) if err != nil { panic(err) } fmt.Printf("Number of documents inserted: %d\n", len(result.InsertedIDs))
Tip
存在しないデータベースとコレクション
書き込み操作を実行するときに必要なデータベースとコレクションが存在しない場合は、サーバーが暗黙的にそれらを作成します。
各ドキュメントには、 フィールドとtype
rating
フィールドに対応するお茶の種類の評価が含まれています。
注意
各例ではObjectID
値が切り捨てられます。この値はドライバーが個別に生成するためです。
一括書き込み (write)
一括操作を実行するには、 WriteModelドキュメントのスライスをBulkWrite()
メソッドに渡します。
動作の変更
BulkWrite()
メソッドはオプションで、その動作を変更するために使用できるオプションを表すBulkWriteOptions
タイプを取ります。 BulkWriteOptions
を指定しない場合、ドライバーは各オプションのデフォルト値を使用します。
BulkWriteOptions
タイプでは、次の方法でオプションを設定できます。
方式 | 説明 |
---|---|
SetBypassDocumentValidation() | Whether to allow the write to opt-out of document level validation. Default: false |
SetOrdered() | Whether to stop performing write operations after an error occurs. Default: true |
Return Values
BulkWrite()
メソッドからは、成功した場合の一括操作に関する情報が含まれるBulkWriteResult
タイプが返されます。 BulkWriteResult
型には次のプロパティが含まれています。
操作
WriteModel
は、挿入、置換、更新、または削除操作を表します。
Insert
挿入操作を実行するには、挿入するドキュメントを指定するInsertOneModel
を作成します。 複数のドキュメントを挿入するには、挿入するドキュメントごとにInsertOneModel
を作成します。
InsertOneModel
では、次の方法で動作を指定できます。
方式 | 説明 |
---|---|
SetDocument() | The document to insert. |
例
次の例では、2 つのドキュメントを挿入するために 2 つのInsertOneModel
インスタンスを作成します。
models := []mongo.WriteModel{ mongo.NewInsertOneModel().SetDocument(bson.D{{"type", "Oolong"}, {"rating", 9}}), mongo.NewInsertOneModel().SetDocument(bson.D{{"type", "Assam"}, {"rating", 6}}), }
置換
置換操作を実行するには、置換するドキュメントと置換ドキュメントを指定するReplaceOneModel
を作成します。 複数のドキュメントを置き換えるには、置き換えるドキュメントごとにReplaceOneModel
を作成します。
ReplaceOneModel
では、次のメソッドで動作を指定できます。
方式 | 説明 |
---|---|
SetCollation() | The type of language collation to use when sorting results. |
SetFilter() | The query filter specifying which document to replace. |
SetHint() | The index to use to scan for documents. |
SetReplacement() | The document to replace the matched document with. |
SetUpsert() | Whether to insert a new document if the query filter doesn't match any documents. |
例
次の例では、 ReplaceOneModel
を作成して、 type
が "Earl gre" であるドキュメントと、 type
が "Matcha" で、 rating
が8
であるドキュメントを置き換えます。
models := []mongo.WriteModel{ mongo.NewReplaceOneModel().SetFilter(bson.D{{"type", "Earl Grey"}}). SetReplacement(bson.D{{"type", "Matcha"}, {"rating", 8}}), }
Update
更新操作を実行するには、更新するドキュメントを指定するUpdateOneModel
と更新ドキュメントを作成します。 複数のドキュメントを更新するには、 UpdateManyModel
を使用します。
UpdateOneModel
とUpdateManyModel
では、次のメソッドで動作を指定できます。
方式 | 説明 |
---|---|
SetArrayFilters() | The array elements the update applies to. |
SetCollation() | The type of language collation to use when sorting results. |
SetFilter() | The query filter specifying which document to update. |
SetHint() | The index to use to scan for documents. |
SetUpdate() | The modifications to apply on the matched documents. |
SetUpsert() | Whether to insert a new document if the query filter doesn't match any documents. |
例
次の例では、ドキュメントtype
が「Masala」の場合、ドキュメントrating
を2
ずつ減算するためのUpdateOneModel
を作成します。
models := []mongo.WriteModel{ mongo.NewUpdateOneModel().SetFilter(bson.D{{"type", "Masala"}}). SetUpdate(bson.D{{"$inc", bson.D{{"rating", -2}}}}), }
削除
削除操作を実行するには、削除するドキュメントを指定してDeleteOneModel
を作成します。 複数のドキュメントを削除するには、 DeleteManyModel
を使用します。
DeleteOneModel
とDeleteManyModel
では、次のメソッドで動作を指定できます。
方式 | 説明 |
---|---|
SetCollation() | The type of language collation to use when sorting results. |
SetFilter() | The query filter specifying which document to delete. |
SetHint() | The index to use to scan for documents. |
例
次の例では、 rating
が7
より大きいドキュメントを削除するためにDeleteManyModel
を作成しています。
models := []mongo.WriteModel{ mongo.NewDeleteManyModel().SetFilter(bson.D{{"rating", bson.D{{"$gt", 7}}}}), }
実行順序
BulkWrite()
メソッドでは、 BulkWriteOptions
で一括操作を順序付きで実行するか、順序なしで実行するかを指定できます。
ordered
デフォルトでは、 BulkWrite()
メソッドは一括操作を追加した順序で実行され、エラーが発生した場合は停止します。
Tip
これは、 SetOrdered()
メソッドでtrue
を指定することと同じです。
opts := options.BulkWrite().SetOrdered(true)
順序なし
一括書き込み操作を任意の順序で実行し、エラーが発生した場合に続行するには、 SetOrdered()
メソッドにfalse
を指定します。 メソッドはその後エラーを報告します。
例
次の例では、次のアクションを任意の順序で実行します。
2 つのドキュメントを挿入します。
タイプが「Earl gre」であるドキュメントを新しいドキュメントに置き換えます。
現在の評価が
7
未満の場合、すべてのドキュメントrating
を3
ずつ増加させます。評価が
9
であるすべてのドキュメントを削除します。
models := []mongo.WriteModel{ mongo.NewInsertOneModel().SetDocument(bson.D{{"type", "Oolong"}, {"rating", 9}}), mongo.NewInsertOneModel().SetDocument(bson.D{{"type", "Assam"}, {"rating", 6}}), mongo.NewReplaceOneModel().SetFilter(bson.D{{"type", "Earl Grey"}}). SetReplacement(bson.D{{"type", "Matcha"}, {"rating", 4}}), mongo.NewUpdateManyModel().SetFilter(bson.D{{"rating", bson.D{{"$lt", 7}}}}). SetUpdate(bson.D{{"$inc", bson.D{{"rating", 3}}}}), mongo.NewDeleteManyModel().SetFilter(bson.D{{"rating", 9}}), } opts := options.BulkWrite().SetOrdered(false) results, err := coll.BulkWrite(context.TODO(), models, opts) if err != nil { panic(err) } fmt.Printf("Number of documents inserted: %d\n", results.InsertedCount) fmt.Printf("Number of documents replaced or updated: %d\n", results.ModifiedCount) fmt.Printf("Number of documents deleted: %d\n", results.DeletedCount)
一括操作後に次のドキュメントがratings
コレクションに存在します。
[{_id ObjectID("...")} {type Masala} {rating 10}] [{_id ObjectID("...")} {type Matcha} {rating 7}]
詳細情報
一括操作の実行可能な例については、 「 一括操作の実行 」を参照してください。
関連操作
上記の操作の実行方法の詳細については、次のガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。