Docs Menu
Docs Home
/
MongoDBマニュアル
/

トランザクションと操作

項目一覧

  • マルチドキュメントトランザクションでサポートされている操作
  • CRUD 操作
  • カウント操作
  • 個別の操作
  • 管理操作
  • 情報に関する操作
  • 制限付き操作

トランザクションについて:

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

  • トランザクションで使用されるコレクションは、異なるデータベースにある可能性があります。

    注意

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

  • Capped コレクションには書き込めません。

  • "snapshot"Capped コレクションから読み取る場合、読み取り保証 は使用できません。(MongoDB 5.0 以降)

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

  • system.* コレクションに書き込み (write) はできません。

  • explain または類似コマンドを使用して、サポートされている操作のクエリプランを返すことはできません。

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

  • トランザクション内で作成されたカーソルの場合、トランザクション外で getMore を呼び出せません。

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

方式
コマンド
注意

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

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

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

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

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

詳細については、「 管理操作 」を参照してください。

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

詳細については、「 管理操作 」を参照してください。

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

詳細については、「 管理操作 」を参照してください。

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

詳細については、「 管理操作 」を参照してください。

注意

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

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

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

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

mongosh には、$group$sum 式と併用してカウントを実行する db.collection.countDocuments() ヘルパー メソッドが用意されています。

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

  • シャーディングされていないコレクションの場合、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 ] }

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

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

コマンド
方式
ノート

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

注意

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

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

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

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

findAndModify と共に upsert: true

db.collection.updateOne() with upsert: true
db.collection.updateMany() with upsert: true
db.collection.replaceOne() with upsert: true

update と共に upsert: true

db.collection.bulkWrite() with insert or upsert:true operations
Various Bulk Operation Methods with insert or upsert:true operations

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

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

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

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

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

  • コレクションの明示的な作成 ( db.createCollection()メソッドとインデックス(例: db.collection.createIndexes()メソッドとdb.collection.createIndex()メソッド( "local"以外の読み取り保証レベルを使用する場合

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

  • その他の CRUD 操作や情報操作以外の操作、例えば createUsergetParametercount などおよびその補助ツール。

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

Tip

以下も参照してください。

戻る

ドライバー API