Docs Menu
Docs Home
/ / /
Go Driver
/ /

複合演算子

項目一覧

  • Overview
  • 検索と削除
  • 検索と更新
  • 検索と置換
  • 詳細情報

このガイドでは、複合操作の実行方法を学習できます。

複合操作は、読み取り操作と書込み (write) 操作を 1 つの操作に結合します。 読み取り操作と書込み操作を個別に実行すると、両方の操作の間に他のユーザーがドキュメントを変更する可能性があります。 MongoDB は、複合操作の実行中に変更されたドキュメントに書込みロック (write lock) を適用することで、これを防ぎます。

MongoDB は次の複合操作をサポートしています。

  • 1 つのドキュメントを検索して削除

  • 1 つのドキュメントを検索して更新

  • 1 つのドキュメントを検索して置換

Tip

複数のドキュメントに対して複合操作を一度に実行する方法については、 トランザクションガイドをご覧ください。

このガイドの例では、 coursesコレクション内のドキュメントのモデルとして、次の Course構造体を使用します。

type Course struct {
Title string
Enrollment int32
}

このガイドの例を実行するには、次のスニペットを使用してサンプルデータをdb.coursesコレクションにロードします。

coll := client.Database("db").Collection("courses")
docs := []interface{}{
Course{Title: "Representation Theory", Enrollment: 40},
Course{Title: "Early Modern Philosophy", Enrollment: 25},
Course{Title: "Animal Communication", Enrollment: 18},
}
result, err := coll.InsertMany(context.TODO(), docs)

各ドキュメントには、各ドキュメントの フィールドとtitle enrollmentフィールドに対応する、コース名と最大登録者数を含む大学コースの説明が含まれています。

Tip

存在しないデータベースとコレクション

書き込み操作を実行するときに必要なデータベースとコレクションが存在しない場合は、サーバーが暗黙的にそれらを作成します。

FindOneAndDelete()メソッドは、指定されたクエリフィルターに一致する最初のドキュメントを検索し、そのドキュメントを削除します。 このメソッドは、削除されたドキュメントを含むSingleResultを返します。

注意

FindOneAndDelete()メソッドはアトミック操作であるため、完了するまで、他の書込み操作によって一致するドキュメントが変更されるのを防ぎます。 deleteOne()メソッドもアトミック操作ですが、一致したドキュメントの並べ替え順序を指定できないという点がFindOneAndDelete()とは異なります。

ドキュメントを検索して個別の操作で削除するには、次を呼び出します
findOne() メソッドとそれに続くdeleteOne()メソッド。

FineOneAndDeleteOptionsを渡すことで、 FindOneAndDelete()メソッドの動作を変更できます。 FineOneAndDeleteOptionsを指定しない場合、ドライバーは各オプションのデフォルト値を使用します。

FineOneAndDeleteOptions タイプでは、次の方法でオプションを設定できます。

方式
説明
SetCollation()
The type of language collation to use when sorting results.
Default: nil
SetMaxTime()
The maximum amount of time that the query can run on the server.
Default: nil
SetProjection()
The fields to include in the document returned.
Default: nil
SetSort()
The sort fields and directions to order the documents matched.
Default: nil
SetHint()
The index to use to scan for documents.
Default: nil

次の例では、 FindOneAndDelete()メソッドを使用して、 enrollmentフィールドの値が20より小さい最初のドキュメントを検索して削除します。

filter := bson.D{{"enrollment", bson.D{{"$lt", 20}}}}
var deletedDoc Course
err := coll.FindOneAndDelete(context.TODO(), filter).Decode(&deletedDoc)
if err != nil {
panic(err)
}
res, _ := bson.MarshalExtJSON(deletedDoc, false, false)
fmt.Println(string(res))

FindOneAndUpdate()メソッドは、指定されたクエリフィルターに一致する最初のドキュメントを検索し、更新ドキュメントに従って更新します。 このメソッドは一致したドキュメントを含むSingleResultを返します。

注意

FindOneAndUpdate()メソッドはアトミック操作であるため、完了するまで、他の書込み操作によって一致するドキュメントが変更されるのを防ぎます。 updateOne()メソッドもアトミック操作ですが、一致したドキュメントの並べ替え順序を指定できないという点がFindOneAndUpdate()とは異なります。

ドキュメントを検索して個別の操作で更新するには、 findOne()メソッドを呼び出し、その後にupdateOne()メソッドを呼び出します。

FineOneAndUpdateOptionsを渡すことで、 FindOneAndUpdate()メソッドの動作を変更できます。 FineOneAndUpdateOptionsを指定しない場合、ドライバーは各オプションのデフォルト値を使用します。

FineOneAndUpdateOptions タイプでは、次の方法でオプションを設定できます。

方式
説明
SetArrayFilters()
The array elements the update applies to.
Default: nil
SetBypassDocumentValidation()
Whether to allow the write operation to opt-out of document level validation.
Default: false
SetCollation()
The type of language collation to use when sorting results.
Default: nil
SetMaxTime()
The maximum amount of time that the query can run on the server.
Default: nil
SetProjection()
The fields to include in the document returned.
Default: nil
SetReturnDocument()
Whether to return the original or updated document in the SingleResult.
Default: options.Before
SetSort()
The sort fields and directions to order the documents matched.
Default: nil
SetUpsert()
Whether to insert a new document if the query filter doesn't match any documents.
Default: false
SetHint()
The index to use to scan for documents.
Default: nil

次の例では、 FindOneAndUpdate()メソッドを使用して、次のアクションを順番に実行します。

  • titleフィールド値に「Modern」が含まれる最初のドキュメントと一致します

  • 一致したドキュメントのenrollmentフィールド値を32に更新します

  • 更新されたドキュメントを返します

filter := bson.D{{"title", bson.D{{"$regex", "Modern"}}}}
update := bson.D{{"$set", bson.D{{"enrollment", 32}}}}
opts := options.FindOneAndUpdate().SetReturnDocument(options.After)
var updatedDoc Course
err := coll.FindOneAndUpdate(context.TODO(), filter, update, opts).Decode(&updatedDoc)
if err != nil {
panic(err)
}
res, _ := bson.MarshalExtJSON(updatedDoc, false, false)
fmt.Println(string(res))

FindOneAndReplace()メソッドは、指定されたクエリフィルターに一致する最初のドキュメントを検索し、それを置換ドキュメントに置き換えます。 このメソッドは一致したドキュメントを含むSingleResultを返します。

注意

このメソッドはReplaceOne()メソッドとは異なります。 FindOneAndReplace()は検索と置換を単一の操作として実行し、両方の操作の間にドキュメントが変更される可能性を排除します。

FineOneAndReplaceOptionsを渡すことで、 FindOneAndReplace()メソッドの動作を変更できます。 FineOneAndReplaceOptionsを指定しない場合、ドライバーは各オプションのデフォルト値を使用します。

FineOneAndReplaceOptions タイプでは、次の方法でオプションを設定できます。

方式
説明
SetBypassDocumentValidation()
Whether to allow the write operation to opt-out of document level validation.
Default: false
SetCollation()
The type of language collation to use when sorting results.
Default: nil
SetMaxTime()
The maximum amount of time that the query can run on the server.
Default: nil
SetProjection()
The fields to include in the document returned.
Default: nil
SetReturnDocument()
Whether to return the original or replaced document in the SingleResult.
Default: nil
SetSort()
The sort fields and directions to order the documents matched.
Default: nil
SetUpsert()
Whether to insert a new document if the query filter doesn't match any documents.
Default: false
SetHint()
The index to use to scan for documents.
Default: nil

次の例では、 FindOneAndReplace()メソッドを使用して、次のアクションを順番に実行します。

  • titleが「表現論理」である最初のドキュメントに一致します

  • 一致したドキュメントを、 titleが「組み合わせ論理」で、 enrollment35の新しいドキュメントを置き換えます

filter := bson.D{{"title", "Representation Theory"}}
replacement := Course{Title: "Combinatorial Theory", Enrollment: 35}
var outdatedDoc Course
err := coll.FindOneAndReplace(context.TODO(), filter, replacement).Decode(&previousDoc)
if err != nil {
panic(err)
}
res, _ := bson.MarshalExtJSON(outdatedDoc, false, false)
fmt.Println(string(res))

上記の操作の実行方法の詳細については、次のガイドを参照してください。

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

戻る

一括操作