AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

トランザクションと操作

MongoDB は、複数の操作、コレクション、データベース、ドキュメント、シャードにわたってトランザクションを使用する能力を提供します。

トランザクションでは、次の読み取り/書込み操作が許可されます。

方式
コマンド
注意

次のクエリ演算子式を除外します。

このメソッドでは、クエリには$match 集計ステージを使用し、カウントを実行するには 式を持つ$group $sum集計ステージを使用します。

シャーディングされていないコレクションで利用できます。

For sharded collections, use the aggregation pipeline with the $group stage. See Distinct Operation.

アップデート操作または置換操作が、存在しないコレクションに対してupsert: trueを使用して実行されると、コレクションが暗黙的に作成されます。

For more details, see Administration Operations.

存在しないコレクションに対して実行すると、コレクションが暗黙的に作成されます。

For more details, see Administration Operations.

存在しないコレクションに対して実行すると、コレクションが暗黙的に作成されます。

For more details, see Administration Operations.

存在しないコレクションに対して実行すると、コレクションが暗黙的に作成されます。

For more details, see Administration Operations.

注意

シャードキー値のアップデート

ドキュメントのシャードキー値(シャードキー フィールドが不変の_idフィールドでない場合)は、 トランザクション 内でまたは 再試行可能な書き込みとして単一ドキュメントのアップデート / findAndModify 操作を発行します。 詳細については、「ドキュメントのシャードキー値の変更 」を参照してください。

トランザクション内でカウント操作を実行するには、$count 集計ステージまたは $group$sum式を使用) 集計ステージを使用します。

MongoDB ドライバーは、$group$sum 式を併用してカウントを実行するヘルパー メソッドとして、コレクションレベルの API countDocuments(filter, options)を提供します。

mongosh provides the db.collection.countDocuments() helper method that uses the $group with a $sum expression to perform a count.

トランザクション内で個別の操作を実行するには、以下を使用できます。

  • シャーディングされていないコレクションの場合、db.collection.distinct() メソッドまたは distinct コマンド、および 集計パイプラインを $group ステージと併用できます。

  • シャーディングされたコレクションの場合、db.collection.distinct() メソッド、または distinct コマンドは使用できません。

    シャーディングされたコレクションの個別の値を検索するには、代わりに $group ステージで集計パイプラインを使用します。以下に例を挙げます。

    • db.coll.distinct("x") の代わりに以下を使用します

      db.coll.aggregate([
      { $group: { _id: null, distinctValues: { $addToSet: "$x" } } },
      { $project: { _id: 0 } }
      ])
    • db.coll.distinct("x", { status: "A" }) の代わりに以下を使用します。

      db.coll.aggregate([
      { $match: { status: "A" } },
      { $group: { _id: null, distinctValues: { $addToSet: "$x" } } },
      { $project: { _id: 0 } }
      ])

    パイプラインはドキュメントにカーソルを返します。

    { "distinctValues" : [ 2, 3, 1 ] }

    カーソルを反復して、結果ドキュメントにアクセスします。

コレクションとインデックスはトランザクション内で作成できます。詳細については、トランザクション内でのコレクションとインデックスの作成 を参照してください。トランザクションで使用されるコレクションは、異なるデータベースにある可能性があります。

注意

クロスシャードの書き込みトランザクションでは新しいコレクションを作成できません。たとえば、あるシャードで既存コレクションに書き込み、別のシャードで暗示的にコレクションを作成する場合、MongoDB では同じトランザクションで両方の操作を実行できません。

トランザクションがクロスシャード間書き込みトランザクション(write transaction)でない場合に、分散トランザクション内にコレクションとインデックスを作成できます。

コマンド
方式
ノート

作成するインデックスは、存在しないコレクションにある必要があります。この場合、コレクションは 操作の一部として作成されます。同じトランザクション内で以前に作成された新しい空のコレクションにある必要があります。

注意

トランザクション内でコレクションまたはインデックスを明示的に作成する場合、トランザクションの読み取り保証(read concern)は "local" でなければなりません。

トランザクション内でのコレクションとインデックスの作成の詳細については、「 トランザクション内でのコレクションとインデックスの作成 」を参照してください。

また、存在しないコレクションに対して次の書込み (write) 操作を行い、暗黙的にコレクションを作成することもできます。

存在しないコレクションに対して実行されるメソッド
存在しないコレクションに対して実行されるコマンド

upsert: trueを使用したdb.collection.findAndModify()
upsert: trueを使用したdb.collection.findOneAndReplace()
upsert: trueを使用したdb.collection.findOneAndUpdate()

findAndModify と共に upsert: true

upsert: trueを使用したdb.collection.updateOne()
upsert: trueを使用したdb.collection.updateMany()
upsert: trueを使用したdb.collection.replaceOne()

update と共に upsert: true

挿入またはupsert:true操作を使用したdb.collection.bulkWrite()
挿入またはupsert:true操作を使用した様々なバルク操作

トランザクションで許可されるその他の CRUD 操作については、「 CRUD 操作 」を参照してください。

トランザクション内でのコレクションとインデックスの作成の詳細については、「 トランザクション内でのコレクションとインデックスの作成 」を参照してください。

情報提供コマンドには、hellobuildInfoconnectionStatus(およびこれらのヘルパー メソッド)などがあり、トランザクションに含めることができますが、最初の操作になることはできません。

次の操作はトランザクションでは許可されません。

  • クロスシャードの書き込みトランザクションで新しいコレクションを作成します。たとえば、あるシャードで既存コレクションに書き込み、別のシャードで暗示的にコレクションを作成する場合、MongoDB では同じトランザクションで両方の操作を実行できません。

  • Explicit creation of collections, e.g. db.createCollection() method, and indexes, e.g. db.collection.createIndexes() and db.collection.createIndex() methods, when using a read concern level other than "local".

  • listCollections コマンドと listIndexes コマンド、およびそのヘルパー メソッド。

  • その他のCRUDや情報操作以外の操作、例えば createUsergetParametercount およびそのヘルパー。

  • 並列操作。複数の名前空間を同時に更新するには、bulkWrite コマンドの使用を検討してください。

  • 上限付きコレクションへの書き込み。

  • 上限付きコレクションから読み取るときに読み取り保証"snapshot" (read concern) を使用します。( MongoDB 5.0 以降)

  • configadmin、または local データベース内のコレクションの読み取りと書き込み。

  • system.* コレクションに書き込みます。

  • サポートされている操作のクエリプランを返すには、 explain または同様のコマンドを使用します。

  • トランザクションの外部で作成されたカーソルでgetMoreを呼び出すか、トランザクション内で作成されたカーソルでトランザクションの外部でgetMoreを呼び出します。

  • killCursors コマンドをトランザクションの最初の操作に指定します。

    注意

    トランザクション内で killCursors コマンドを実行すると、サーバーは指定されたカーソルを直ちに停止します。トランザクションがコミットされるのを待ちません