MongoDB とドライバー
定義
構文
The findOneAndDelete() method has the following form:
db.collection.findOneAndDelete( <filter>, { writeConcern: <document>, projection: <document>, sort: <document>, maxTimeMS: <number>, collation: <document> } )
パラメーター
The findOneAndDelete() method takes the following parameters:
Parameter | タイプ | 説明 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ドキュメント | 削除操作の選択基準。 コレクションで返される最初のドキュメントを削除するには、空のドキュメント 指定しない場合、デフォルトは空のドキュメントになります。 クエリ引数がドキュメントでない場合、操作はエラーになります。 | ||||||||||
| ドキュメント | 任意。書込み保証(write concern)を表現するドキュメント。デフォルトの書込み保証を使用する場合は省略します。 See Delete A Document Using WriteConcern for usage. トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。 | ||||||||||
| ドキュメント | 任意。返すフィールドのサブセット。 返されたドキュメント内のすべてのフィールドを返すには、このパラメーターを省略します。 プロジェクションの引数がドキュメントでない場合、操作はエラーになります。 | ||||||||||
| ドキュメント | |||||||||||
| 数値 | 任意。 操作が 以内に完了する必要がある制限時間をミリ秒単位で指定します。 制限を超えた場合はエラーがスローされます。 | ||||||||||
| ドキュメント | 任意。 任意。操作に使用する照合を指定します。 照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。 照合オプションの構文は次のとおりです。 照合を指定する場合、 照合が指定されていなくても、コレクションにデフォルトの照合が設定されている場合( コレクションにも操作にも照合が指定されていない場合、MongoDB では以前のバージョンで使用されていた単純なバイナリ比較によって文字列が比較されます。 1 つの操作に複数の照合は指定できません。たとえば、フィールドごとに異なる照合を指定できません。また、ソートと検索を一度に実行する場合、検索とソートで別の照合を使用できません。 |
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas はクラウドでの MongoDB 配置のための完全管理サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
動作
ドキュメント一致
findOneAndDelete() deletes the first matching document in the collection that matches the filter. The sort parameter can be used to influence which document is deleted.
プロジェクション
重要
言語の整合性
find()とfindAndModify()のプロジェクションを集計の$projectステージと一貫性を持たせるために、
find()とfindAndModify()のプロジェクションは集計式と構文 を受け付けます。MongoDB は、プロジェクションに関して追加の制限を適用します。詳細については、「プロジェクションの制限」を参照してください。
projectionパラメータは次の形式のドキュメントを取ります。
{ field1: <value>, field2: <value> ... }
プロジェクション | 説明 |
|---|---|
| フィールドを包含することを指定します。プロジェクションの値としてゼロ以外の整数を指定した場合、その値を |
| フィールドの除外を指定します。 |
| |
| 配列プロジェクション 演算子( ビューには使用できません。 |
| プロジェクションを行ったフィールドの値を指定します。 集計式と構文の使用(リテラルと集計変数の使用を含む)では、新しいフィールドをプロジェクションしたり、既存のフィールドを新しい値でプロジェクションしたりできます。
|
埋め込みフィールド仕様
埋め込みドキュメント内のフィールドの場合は、次のいずれかを使用してフィールドを指定できます。
ドット表記の場合は次のようになります。
"field.nestedfield": <value>ネストされた形式の例
{ field: { nestedfield: <value> } }
_id フィールドプロジェクション
_id フィールドは、プロジェクションで _id: 0 を明示的に指定して抑制しない限り、返されるドキュメントにデフォルトで含まれます。
包含または除外
projection には、 _id フィールドを除いて、包含指定と除外指定の両方を含めることはできません。
フィールドを明示的に含めるプロジェクションでは、
_idフィールドだけが明示的に除外できる唯一のフィールドです。フィールドを明示的に除外するプロジェクションでは、
_idフィールドが明示的に包含できる唯一のフィールドですが、デフォルトで_idフィールドが含まれます。
プロジェクションの詳細については、以下も参照してください。
シャーディングされたコレクション
シャーディングされたコレクション内のドキュメントには、シャードキー フィールドがない場合があります。シャードキーがないドキュメントを対象とするには、null の等価一致を別のフィルター条件(_id フィールド上と同様に)と組み合わせて使用できます。例:
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
トランザクション
db.collection.findOneAndDelete() can be used inside distributed transactions.
トランザクションで実行される場合、操作の書込み保証 (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 } ] )
The following operation uses a write concern document inside of the db.collection.findOneAndDelete() method with options:
w:1書き込み (write) 操作がスタンドアロン mongod またはレプリカセット内のプライマリに伝達されたことの確認を要求します。j:truew: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" }