db.collection.findOneAndDelete()
MongoDB とドライバー
このページでは、 mongosh
メソッドについて説明します。MongoDB ドライバーで同等のメソッドを確認するには、ご使用のプログラミング言語の対応するページを参照してください。
定義
db.collection.findOneAndDelete( filter, options )
filter
およびsort
の条件に基づいて単一のドキュメントを削除し、削除されたドキュメントを返します。findOneAndDelete()
メソッドの形式は次のとおりです。db.collection.findOneAndDelete( <filter>, { writeConcern: <document>, projection: <document>, sort: <document>, maxTimeMS: <number>, collation: <document> } ) findOneAndDelete()
メソッドは次のパラメーターを取ります。Parameterタイプ説明filter
ドキュメント削除操作の選択基準。
find()
メソッドと同じ クエリ セレクターが使用できます。コレクションで返される最初のドキュメントを削除するには、空のドキュメント
{ }
を指定します。指定しない場合、デフォルトは空のドキュメントになります。
クエリ引数がドキュメントでない場合、操作はエラーになります。
writeConcern
ドキュメント任意。書込み保証(write concern)を表現するドキュメント。デフォルトの書込み保証を使用する場合は省略します。
{ w: <value>, j: <boolean>, wtimeout: <number> } 使用方法については、「 WriteConcern を使用したドキュメントの削除」を参照してください。
トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。
projection
ドキュメント任意。返すフィールドのサブセット。
返されたドキュメント内のすべてのフィールドを返すには、このパラメーターを省略します。
プロジェクションの引数がドキュメントでない場合、操作はエラーになります。
sort
ドキュメントmaxTimeMS
数値任意。 操作が 以内に完了する必要がある制限時間をミリ秒単位で指定します。 制限を超えた場合はエラーがスローされます。collation
ドキュメント任意。
操作に使用する照合を指定します。
照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。
照合オプションの構文は次のとおりです。
collation: { locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> } 照合を指定する場合、
locale
フィールドは必須ですが、その他の照合フィールドはすべて任意です。フィールドの説明については、照合ドキュメントを参照してください。照合が指定されていなくても、コレクションにデフォルトの照合が設定されている場合(
db.createCollection()
を参照)には、コレクションの照合が使用されます。コレクションにも操作にも照合が指定されていない場合、MongoDB では以前のバージョンで使用されていた単純なバイナリ比較によって文字列が比較されます。
1 つの操作に複数の照合は指定できません。たとえば、フィールドごとに異なる照合を指定できません。また、ソートと検索を一度に実行する場合、検索とソートで別の照合を使用できません。
次の値を返します。 削除されたドキュメントを返します。
動作
ドキュメント一致
findOneAndDelete()
は、コレクション内で filter
と最初に一致したドキュメントを削除します。sort
パラメータを使用して、どのドキュメントを削除するか制御できます。
プロジェクション
重要
言語の整合性
find()
とfindAndModify()
のプロジェクションを集計の$project
ステージと一貫性を持たせるために、
find()
とfindAndModify()
のプロジェクションは集計式と構文 を受け付けます。MongoDB は、プロジェクションに関して追加の制限を適用します。詳細については、「プロジェクションの制限」を参照してください。
projection
パラメータは次の形式のドキュメントを取ります。
{ field1: <value>, field2: <value> ... }
プロジェクション | 説明 |
---|---|
<field>: <1 or true> | フィールドを包含することを指定します。プロジェクションの値としてゼロ以外の整数を指定した場合、その値を true として処理します。 |
<field>: <0 or false> | フィールドの除外を指定します。 |
"<field>.$": <1 or true> | |
<field>: <array projection> | 配列プロジェクション 演算子( ビューには使用できません。 |
<field>: <aggregation expression> | プロジェクションを行ったフィールドの値を指定します。 集計式と構文の使用(リテラルと集計変数の使用を含む)では、新しいフィールドをプロジェクションしたり、既存のフィールドを新しい値でプロジェクションしたりできます。
|
埋め込みフィールド仕様
埋め込みドキュメント内のフィールドの場合は、次のいずれかを使用してフィールドを指定できます。
ドット表記の場合は次のようになります。
"field.nestedfield": <value>
ネストされた形式の例
{ field: { nestedfield: <value> } }
_id
フィールドプロジェクション
_id
フィールドは、プロジェクションで _id: 0
を明示的に指定して抑制しない限り、返されるドキュメントにデフォルトで含まれます。
包含または除外
projection
には、 _id
フィールドを除いて、包含指定と除外指定の両方を含めることはできません。
フィールドを明示的に含めるプロジェクションでは、
_id
フィールドだけが明示的に除外できる唯一のフィールドです。フィールドを明示的に除外するプロジェクションでは、
_id
フィールドが明示的に包含できる唯一のフィールドですが、デフォルトで_id
フィールドが含まれます。
プロジェクションの詳細については、以下も参照してください。
シャーディングされたコレクション
db.collection.findOneAndDelete()
シャーディングされたコレクションに対して を使用する場合、 にはquery
シャードキー の等価条件が含まれている 必要 があります。
シャーディングされたコレクション内のドキュメントには、シャードキー フィールドがない場合があります。シャードキーがないドキュメントをターゲットにするには、null
等価一致を別のフィルター条件(_id
フィールドなど)と組み合わせて使用できます。以下に例を挙げます。
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
トランザクション
db.collection.findOneAndDelete()
は分散トランザクション内で使用できます。
トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。
重要
ほとんどの場合、分散トランザクションでは 1 つのドキュメントの書き込み (write) よりもパフォーマンス コストが高くなります。分散トランザクションの可用性は、効果的なスキーマ設計の代わりにはなりません。多くのシナリオにおいて、非正規化されたデータモデル(埋め込みドキュメントと配列)が引き続きデータやユースケースに最適です。つまり、多くのシナリオにおいて、データを適切にモデリングすることで、分散トランザクションの必要性を最小限に抑えることができます。
トランザクションの使用に関するその他の考慮事項(ランタイム制限や oplog サイズ制限など)については、「本番環境での考慮事項」も参照してください。
Oplog エントリ
db.collection.findOneAndDelete()
操作によってドキュメントが正常に削除されると、その操作によってoplog (操作ログ)にエントリが追加されます。 操作が失敗した場合、または削除するドキュメントが見つからなかった場合は、その操作によって oplog にエントリが追加されることはありません。
例
ドキュメントの削除
scores
コレクションには、以下と同様のドキュメントが含まれています。
db.scores.insertMany( [ { _id: 6305, name : "A. MacDyver", "assignment" : 5, "points" : 24 }, { _id: 6308, name : "B. Batlock", "assignment" : 3, "points" : 22 }, { _id: 6312, name : "M. Tagnum", "assignment" : 5, "points" : 30 }, { _id: 6319, name : "R. Stiles", "assignment" : 2, "points" : 12 }, { _id: 6322, name : "A. MacDyver", "assignment" : 2, "points" : 14 }, { _id: 6234, name : "R. Stiles", "assignment" : 1, "points" : 10 } ] )
次の操作では、 name : M. Tagnum
の最初のドキュメントを検索して削除します。
db.scores.findOneAndDelete( { "name" : "M. Tagnum" } )
この操作では削除された元のドキュメントを返します。
{ _id: 6312, name: "M. Tagnum", "assignment" : 5, "points" : 30 }
WriteConcern を使用してドキュメントを削除する
scores
コレクションには、以下と同様のドキュメントが含まれています。
db.scores.insertMany( [ { _id: 6305, name : "A. MacDyver", "assignment" : 5, "points" : 24 }, { _id: 6308, name : "B. Batlock", "assignment" : 3, "points" : 22 }, { _id: 6312, name : "M. Tagnum", "assignment" : 5, "points" : 30 }, { _id: 6319, name : "R. Stiles", "assignment" : 2, "points" : 12 }, { _id: 6322, name : "A. MacDyver", "assignment" : 2, "points" : 14 }, { _id: 6234, name : "R. Stiles", "assignment" : 1, "points" : 10 } ] )
次の操作では、オプションを使用してdb.collection.findOneAndDelete()
メソッド内の書込み保証 (write concern) ドキュメントを使用します。
w:1
書き込み (write) 操作がスタンドアロン mongod またはレプリカセット内のプライマリに伝達されたことの確認を要求します。j:true
w:1
で指定された MongoDB インスタンスの数に示し、ディスク上のジャーナルに削除内容を書き込むようにします。wtimeout : 1000
書込み保証 (write concern) に関する制限時間をミリ秒単位で指定します。wtimeout
はw
の値が1より大きい場合にのみ適用されます。
db.scores.findOneAndDelete( { name: "A. MacDyver" }, { writeConcern: { w : 1, j : true, wtimeout : 1000 } } )
この操作を実行すると次のドキュメントが返されます。
{ _id: 6305, name: 'A. MacDyver', assignment: 5, points: 24 }
指定された writeConcern オプションを使用してドキュメントは削除されます。
ドキュメントの並べ替えと削除
scores
コレクションには、以下と同様のドキュメントが含まれています。
db.scores.insertMany( [ { _id: 6305, name : "A. MacDyver", "assignment" : 5, "points" : 24 }, { _id: 6308, name : "B. Batlock", "assignment" : 3, "points" : 22 }, { _id: 6312, name : "M. Tagnum", "assignment" : 5, "points" : 30 }, { _id: 6319, name : "R. Stiles", "assignment" : 2, "points" : 12 }, { _id: 6322, name : "A. MacDyver", "assignment" : 2, "points" : 14 }, { _id: 6234, name : "R. Stiles", "assignment" : 1, "points" : 10 } ] )
次の操作では、まず name : "A. MacDyver"
のすべてのドキュメントを検索します。次に、points
の昇順で並べ替えてから、ポイント値が最も低いドキュメントを削除します。
db.scores.findOneAndDelete( { "name" : "A. MacDyver" }, { sort : { "points" : 1 } } )
この操作では削除された元のドキュメントを返します。
{ _id: 6322, name: "A. MacDyver", "assignment" : 2, "points" : 14 }
削除したドキュメントのプロジェクション
次の操作では、プロジェクションを使用して、返されたドキュメントの _id
フィールドと assignment
フィールドのみを返します。
db.scores.findOneAndDelete( { "name" : "A. MacDyver" }, { sort : { "points" : 1 }, projection: { "assignment" : 1 } } )
この操作では、assignment
フィールドと _id
フィールドを含む元のドキュメントが返されます。
{ _id: 6322, "assignment" : 2 }
時間制限のあるドキュメントの更新
次の操作では、削除完了に関して 5 ミリ秒の時間制限が設定されています。
try { db.scores.findOneAndDelete( { "name" : "A. MacDyver" }, { sort : { "points" : 1 }, maxTimeMS : 5 } ) } catch(e){ print(e) }
操作が時間制限を超えた場合、以下が返されます。
MongoServerError: operation exceeded time limit: { "ok": 0, "code" : 50, "codeName" : "MaxTimeMSExpired" }
注意
簡潔にするためにエラーメッセージは短縮されています。
照合の指定
照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。
コレクション myColl
は、次のドキュメントを含みます。
db.myColl.insertMany( [ { _id: 1, category: "café", status: "A" }, { _id: 2, category: "cafe", status: "a" }, { _id: 3, category: "cafE", status: "a" } ] )
次の操作には照合オプションが含まれます。
db.myColl.findOneAndDelete( { category: "cafe", status: "a" }, { collation: { locale: "fr", strength: 1 } } );
この操作を実行すると次のドキュメントが返されます。
{ "_id" : 1, "category" : "café", "status" : "A" }