トランザクションと操作
トランザクションについて:
コレクションとインデックスはトランザクション内で作成できます。 詳細については、 「トランザクション内でのコレクションとインデックスの作成」を参照してください
トランザクションで使用されるコレクションは、異なるデータベースにある可能性があります。
注意
クロスシャードの書き込みトランザクションでは新しいコレクションを作成できません。たとえば、あるシャードで既存コレクションに書き込み、別のシャードで暗示的にコレクションを作成する場合、MongoDB では同じトランザクションで両方の操作を実行できません。
Capped コレクションには書き込めません。
"snapshot"
Capped コレクションから読み取る場合、読み取り保証 は使用できません。(MongoDB 5.0 以降)config
データベース、admin
データベース、またはlocal
データベース内のコレクションの読み取りと書き込みはできません。system.*
コレクションに書き込み (write) はできません。explain
または類似コマンドを使用して、サポートされている操作のクエリプランを返すことはできません。
トランザクションの外部で作成されたカーソルの場合、トランザクション内で
getMore
を呼び出せません。トランザクション内で作成されたカーソルの場合、トランザクション外で
getMore
を呼び出せません。
killCursors
コマンドをトランザクションの最初の操作に指定することはできません。さらに、トランザクション内で
killCursors
コマンドを実行すると、サーバーは指定されたカーソルを直ちに停止します。トランザクションがコミットされるのを待ちません。
マルチドキュメントトランザクションでサポートされている操作
CRUD 操作
トランザクションでは、次の読み取り/書込み操作が許可されます。
方式 | コマンド | 注意 |
---|---|---|
シャーディングされていないコレクションで利用できます。 For sharded collections, use the aggregation pipeline with the
$group stage. See Distinct Operation. | ||
アップデート操作または置換操作が、存在しないコレクションに対して 詳細については、「 管理操作 」を参照してください。 | ||
存在しないコレクションに対して実行すると、コレクションが暗黙的に作成されます。 詳細については、「 管理操作 」を参照してください。 | ||
存在しないコレクションに対して実行すると、コレクションが暗黙的に作成されます。 詳細については、「 管理操作 」を参照してください。 | ||
存在しないコレクションに対して実行すると、コレクションが暗黙的に作成されます。 詳細については、「 管理操作 」を参照してください。 |
注意
シャードキー値のアップデート
ドキュメントのシャードキー値(シャードキー フィールドが不変の_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) 操作を行い、暗黙的にコレクションを作成することもできます。
存在しないコレクションに対して実行されるメソッド | 存在しないコレクションに対して実行されるコマンド |
---|---|
db.collection.findAndModify() with upsert: true db.collection.findOneAndReplace() with upsert: true db.collection.findOneAndUpdate() with upsert: true |
|
db.collection.updateOne() with upsert: true db.collection.updateMany() with upsert: true db.collection.replaceOne() with upsert: true |
|
db.collection.bulkWrite() with insert or upsert:true operationsVarious Bulk Operation Methods with insert or upsert:true operations |
トランザクションで許可されるその他の CRUD 操作については、「 CRUD 操作 」を参照してください。
トランザクション内でのコレクションとインデックスの作成の詳細については、「 トランザクション内でのコレクションとインデックスの作成 」を参照してください。
情報に関する操作
情報提供コマンドには、hello
、buildInfo
、connectionStatus
(およびこれらのヘルパー メソッド)などがあり、トランザクションに含めることができますが、最初の操作になることはできません。
制限付き操作
次の操作はトランザクションでは許可されません。
クロスシャードの書き込みトランザクションで新しいコレクションを作成します。たとえば、あるシャードで既存コレクションに書き込み、別のシャードで暗示的にコレクションを作成する場合、MongoDB では同じトランザクションで両方の操作を実行できません。
コレクションの明示的な作成 (
db.createCollection()
メソッドとインデックス(例:db.collection.createIndexes()
メソッドとdb.collection.createIndex()
メソッド("local"
以外の読み取り保証レベルを使用する場合listCollections
コマンドとlistIndexes
コマンド、およびそのヘルパー メソッド。その他の CRUD 操作や情報操作以外の操作、例えば
createUser
、getParameter
、count
などおよびその補助ツール。並列操作。複数の名前空間を同時に更新するには、代わりに
bulkWrite
コマンドの使用を検討してください。