AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

複合演算子

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

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

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

Tip

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

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

type Course struct {
Title string
Enrollment int32
}

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

coll := client.Database("db").Collection("courses")
docs := []any{
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() メソッドを呼び出します。

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

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

方式
説明

SetCollation()

結果をソートするときに使用する言語照合のタイプ。デフォルト:
nil

SetProjection()


返されるドキュメントに含めるフィールド。デフォルト:nil

SetSort()

一致したドキュメントを並べ替えるソート フィールドと方向。デフォルト:
nil

SetHint()


ドキュメントをスキャンするために使用するインデックス。デフォルト: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))
{"title":"Animal Communication","enrollment":18}

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

注意

FindOneAndUpdate() メソッドはアトミック操作であるため、完了するまで、他の書込み操作によって一致するドキュメントが変更されるのを防ぎます。UpdateOne() メソッドもアトミック操作ですが、UpdateOne() を使用する場合は更新されたドキュメントの変更前のイメージを返すことができないため、FindOneAndUpdate() とは異なります。

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

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

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

方式
説明

SetArrayFilters()


アップデートが適用される配列要素。デフォルト:nil

SetBypassDocumentValidation()

書込み(write)操作がドキュメントレベルの検証をオプトアウトできるようにするかどうか。デフォルト:
false

SetCollation()

結果をソートするときに使用する言語照合のタイプ。デフォルト:
nil

SetProjection()


返されるドキュメントに含めるフィールド。デフォルト:nil

SetReturnDocument()

SingleResult
に元のドキュメントと更新されたドキュメントのどちらを返すか。デフォルト:options.Before

SetSort()

一致したドキュメントを並べ替えるソート フィールドと方向。デフォルト:
nil

SetUpsert()

クエリフィルターがどのドキュメントにも一致しない場合に新しいドキュメントを挿入するかどうか。デフォルト:
false

SetHint()


ドキュメントをスキャンするために使用するインデックス。デフォルト: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))
{"title":"Early Modern Philosophy","enrollment":32}

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

注意

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

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

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

方式
説明

SetBypassDocumentValidation()

書込み(write)操作がドキュメントレベルの検証をオプトアウトできるようにするかどうか。デフォルト:
false

SetCollation()

結果をソートするときに使用する言語照合のタイプ。デフォルト:
nil

SetProjection()


返されるドキュメントに含めるフィールド。デフォルト:nil

SetReturnDocument()

SingleResult
に元のドキュメントまたは置換されたドキュメントを返すかどうか。デフォルト:nil

SetSort()

一致したドキュメントを並べ替えるソート フィールドと方向。デフォルト:
nil

SetUpsert()

クエリフィルターがどのドキュメントにも一致しない場合に新しいドキュメントを挿入するかどうか。デフォルト:
false

SetHint()


ドキュメントをスキャンするために使用するインデックス。デフォルト: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))
{"title":"Representation Theory","enrollment":40}

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

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