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

削除

項目一覧

  • 定義
  • 互換性
  • 構文
  • コマンドフィールド
  • 動作
  • 出力
delete

deleteコマンドは、コレクションからドキュメントを削除します。 単一のdeleteコマンドに複数の削除指定を含めることができます。 MongoDB ドライバーが提供する削除メソッドは、このコマンドを内部的に使用します。

バージョン 5.0 での変更

Tip

mongosh では、このコマンドは deleteOne()deleteMany()findOneAndDelete() ヘルパー メソッドを通じても実行できます。

ヘルパー メソッドはmongoshユーザーには便利ですが、データベースコマンドと同じレベルの情報は返されない可能性があります。 便宜上必要ない場合、または追加の戻りフィールドが必要な場合は、 データベースコマンドを使用します。

次の値を返します。操作のステータスを含むドキュメント。詳細については、「出力」を参照してください。

このコマンドは、次の環境でホストされている配置で使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

注意

このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、 「サポートされていないコマンド」を参照してください。

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

このコマンドの構文は、次のとおりです。

db.runCommand(
{
delete: <collection>,
deletes: [
{
q : <query>,
limit : <integer>,
collation: <document>,
hint: <document|string>
},
...
],
comment: <any>,
let: <document>, // Added in MongoDB 5.0
ordered: <boolean>,
writeConcern: { <write concern> },
maxTimeMS: <integer>
}
)

このコマンドは、次のフィールドを使用します。

フィールド
タイプ
説明
string

ターゲット コレクションの名前。

配列

指定したコレクション内で実行する 1 つ以上の delete ステートメントの配列。

comment
any

任意。このコマンドに添付するユーザー指定のコメント。設定すると、このコメントは以下の場所にこのコマンドの記録と合わせて表示されます。

コメントには、有効な BSON 型(string, integer, object, array など)を使用できます。

ドキュメント

任意。

変数のリストを含むドキュメントを指定します。これにより、変数をクエリテキストから分離することで、コマンドの読みやすさを向上させることができます。

ドキュメントの構文は次のとおりです。

{
<variable_name_1>: <expression_1>,
...,
<variable_name_n>: <expression_n>
}

変数は式によって返された値に設定され、その後は変更できません。

コマンド内の変数の値にアクセスするには、二重ドル記号の接頭辞($$)を $$<variable_name> 形式にした変数名とともに使用します。たとえば次のとおりです。$$targetTotal

結果のフィルタリングに変数を使用するには、$expr 演算子内の変数にアクセスする必要があります。

let と変数を使用した完全な例については、「let における変数の使用」を参照してください。

バージョン 5.0 で追加

ブール値

任意。true の場合、delete ステートメントが失敗すると、残りの delete ステートメントを実行せずに戻ります。false の場合、delete ステートメントが失敗すると、残りの delete ステートメントがあれば続行します。デフォルトは true です。

ドキュメント

任意。delete コマンドの書込み保証(write concern)を表すドキュメント。デフォルトの書込み保証を使用する場合は省略します。

トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。

maxTimeMS
non-negative integer

任意。

時間制限をミリ秒単位で指定します。maxTimeMS の値を指定しない場合、操作はタイムアウトしません。値を 0 にすると、デフォルトの無制限動作を明示的に指定します。

MongoDB は、db.killOp() と同じメカニズムを使用して、割り当てられた時間制限を超えた操作を終了します。MongoDB は、指定された割り込みポイントのいずれかでのみ操作を終了します。

deletes 配列の各要素には、次のフィールドが含まれています。

フィールド
タイプ
説明
ドキュメント

削除するドキュメントに一致するクエリ。

integer

一致する削除対象のドキュメントの数。一致するすべてのドキュメントを削除する 0 を指定するか、単一のドキュメントを削除する 1 を指定します。

ドキュメント

任意。

操作に使用する照合を指定します。

照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。

照合オプションの構文は次のとおりです。

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

照合を指定する場合、locale フィールドは必須ですが、その他の照合フィールドはすべて任意です。フィールドの説明については、照合ドキュメントを参照してください。

照合が指定されていなくても、コレクションにデフォルトの照合が設定されている場合(db.createCollection() を参照)には、コレクションの照合が使用されます。

コレクションにも操作にも照合が指定されていない場合、MongoDB では以前のバージョンで使用されていた単純なバイナリ比較によって文字列が比較されます。

1 つの操作に複数の照合は指定できません。たとえば、フィールドごとに異なる照合を指定できません。また、ソートと検索を一度に実行する場合、検索とソートで別の照合を使用できません。

ドキュメントまたは文字列

任意。 クエリ述語 をサポートするために使用する インデックス を指定するドキュメントまたは string です。

このオプションには、インデックス仕様ドキュメントまたはインデックス名の文字列を指定できます。

存在しないインデックスを指定した場合、操作はエラーになります。

例については、「削除操作での hint の指定」を参照してください。

limit: 1 オプションを指定するシャーディングされたコレクションに対して delete 操作を使用するには次のようにします。

  • 1つのシャードのみをターゲットにする場合は、クエリ仕様で部分的なシャードキーを使用するか、

  • クエリ仕様でシャードキーまたは _id フィールドを指定できます。

deletes 配列内のすべてのクエリ(つまり、q フィールド値)の合計サイズは、最大 BSON ドキュメント サイズ以下である必要があります。

deletes 配列内の削除ドキュメントの総数は、最大バルクサイズ以下である必要があります。

delete は、分散トランザクション内で使用できます。

トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。

重要

ほとんどの場合、分散トランザクションでは 1 つのドキュメントの書き込み (write) よりもパフォーマンス コストが高くなります。分散トランザクションの可用性は、効果的なスキーマ設計の代わりにはなりません。多くのシナリオにおいて、非正規化されたデータモデル(埋め込みドキュメントと配列)が引き続きデータやユースケースに最適です。つまり、多くのシナリオにおいて、データを適切にモデリングすることで、分散トランザクションの必要性を最小限に抑えることができます。

トランザクションの使用に関するその他の考慮事項(ランタイム制限や oplog サイズ制限など)については、「本番環境での考慮事項」も参照してください。

次の例では、1limit を指定して、statusD と等しいドキュメントを 1 つ orders コレクションから削除します。

db.runCommand(
{
delete: "orders",
deletes: [ { q: { status: "D" }, limit: 1 } ]
}
)

返されたドキュメントは、コマンドによって1ドキュメントが削除されたことを示しています。 詳細については、「出力」を参照してください。

{ "ok" : 1, "n" : 1 }

注意

limit: 1 オプションを指定するシャーディングされたコレクションに対して delete 操作を使用するには次のようにします。

  • 1つのシャードのみをターゲットにする場合は、クエリ仕様で部分的なシャードキーを使用するか、

  • クエリ仕様でシャードキーまたは _id フィールドを指定できます。

次の例では、0limit を指定して、statusD に等しいすべてのドキュメントを orders コレクションから削除します。

db.runCommand(
{
delete: "orders",
deletes: [ { q: { status: "D" }, limit: 0 } ],
writeConcern: { w: "majority", wtimeout: 5000 }
}
)

返されたドキュメントは、コマンドによって13ドキュメントが見つかり、削除されたことを示しています。 詳細については、「出力」を参照してください。

{ "ok" : 1, "n" : 13 }

注意

大きなコレクション内のすべてのドキュメントを削除している場合は、コレクションを削除して再作成する方が高速な場合があります。 コレクションのすべてのインデックスに注意してください。 元のコレクションに存在していたインデックスはすべて再作成する必要があります。元のコレクションがシャーディングされている場合は、再作成されたコレクションもシャーディングする必要があります。

コレクションの削除について詳しくは、db.collection.drop() を参照してください。

空のクエリ条件と 0limit を指定して orders コレクション内のすべてのドキュメントを削除します。

db.runCommand(
{
delete: "orders",
deletes: [ { q: { }, limit: 0 } ],
writeConcern: { w: "majority", wtimeout: 5000 }
}
)

返されたドキュメントは、コマンドによって合計35ドキュメントが見つかり、削除されたことを示しています。 詳細については、「出力」を参照してください。

{ "ok" : 1, "n" : 35 }

次の例では、orders コレクションに対して複数の削除操作を実行します。

db.runCommand(
{
delete: "orders",
deletes: [
{ q: { status: "D" }, limit: 0 },
{ q: { cust_num: 99999, item: "abc123", status: "A" }, limit: 1 }
],
ordered: false,
writeConcern: { w: 1 }
}
)

返されたドキュメントは、コマンドが 2 回の削除ステートメントで合計21ドキュメントを見つけ、削除したことを示しています。 詳細については、「出力」を参照してください。

{ "ok" : 1, "n" : 21 }

照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。

コレクション myCollは、次のドキュメントを含みます。

{ _id: 1, category: "café", status: "A" }
{ _id: 2, category: "cafe", status: "a" }
{ _id: 3, category: "cafE", status: "a" }

次の操作には照合オプションが含まれます。

db.runCommand({
delete: "myColl",
deletes: [
{ q: { category: "cafe", status: "a" }, limit: 0, collation: { locale: "fr", strength: 1 } }
]
})

mongosh で、次のドキュメントを含む members コレクションを作成します。

db.members.insertMany([
{ "_id" : 1, "member" : "abc123", "status" : "P", "points" : 0, "misc1" : null, "misc2" : null },
{ "_id" : 2, "member" : "xyz123", "status" : "A", "points" : 60, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" },
{ "_id" : 3, "member" : "lmn123", "status" : "P", "points" : 0, "misc1" : null, "misc2" : null },
{ "_id" : 4, "member" : "pqr123", "status" : "D", "points" : 20, "misc1" : "Deactivated", "misc2" : null },
{ "_id" : 5, "member" : "ijk123", "status" : "P", "points" : 0, "misc1" : null, "misc2" : null },
{ "_id" : 6, "member" : "cde123", "status" : "A", "points" : 86, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" }
])

コレクションに次のインデックスを作成します。

db.members.createIndex( { status: 1 } )
db.members.createIndex( { points: 1 } )

次の削除操作は、インデックス { status: 1 } を使用することを明示的に指定します。

db.runCommand({
delete: "members",
deletes: [
{ q: { "points": { $lte: 20 }, "status": "P" }, limit: 0, hint: { status: 1 } }
]
})

注意

存在しないインデックスを指定した場合、操作はエラーになります。

使用されたインデックスを確認するには、次の操作で explain を実行します。

db.runCommand(
{
explain: {
delete: "members",
deletes: [
{ q: { "points": { $lte: 20 }, "status": "P" }, limit: 0, hint: { status: 1 } }
]
},
verbosity: "queryPlanner"
}
)

バージョン 5.0 で追加

コマンド内の他の場所からアクセスできる変数を定義するには let オプションを使用します。

注意

変数を使用して結果をフィルタリングするには、$expr 演算子内の変数にアクセスする必要があります。

コレクション cakeFlavors を以下ように作成します。

db.cakeFlavors.insertMany( [
{ _id: 1, flavor: "chocolate" },
{ _id: 2, flavor: "strawberry" },
{ _id: 3, flavor: "cherry" }
] )

次の例では、lettargetFlavor 変数を定義し、その変数を使用してストロベリー ケーキのフレーバーを削除します。

db.runCommand( {
delete: db.cakeFlavors.getName(),
deletes: [ {
q: { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } },
limit: 1
} ],
let : { targetFlavor: "strawberry" }
} )

返されるドキュメントには、次のフィールドのサブセットが含まれます。

delete.ok

コマンドのステータスです。

delete.n

削除されたドキュメントの数。

delete.writeErrors

削除操作中に発生したエラーに関する情報を含むドキュメントの配列。writeErrors 配列には、エラーが発生した各 delete ステートメントのエラー ドキュメントが含まれています。

各エラードキュメントには、次の情報が含まれています。

delete.writeErrors.index

deletes 配列内の delete ステートメントを識別する整数。0 から始まるインデックスを使用します。

delete.writeErrors.code

エラーを識別する整数値です。

delete.writeErrors.errmsg

エラーの説明です。

delete.writeConcernError

書込み保証 (write concern) に関連するエラーを説明するドキュメント。

バージョン7.1での変更: deletemongosで実行される場合、1 つ以上の書込みエラーが発生しても、書込み保証エラーが常に報告されます。

以前のリリースでは、書込みエラーが発生すると、 deleteは書込み保証エラーを報告しないことがありました。

writeConcernErrorドキュメントには次のフィールドが含まれています。

delete.writeConcernError.code

書込み保証 (write concern) エラーの原因を示す整数値です。

delete.writeConcernError.errmsg

書込み保証 (write concern) エラーの原因の説明です。

delete.writeConcernError.errInfo.writeConcern

対応する操作に使用される書込み保証 (write concern) オブジェクトです。書込み保証 (write concern) オブジェクト フィールドの詳細については、「書込み保証 (write concern) の仕様」を参照してください。

書込み保証 (write concern) オブジェクトには、書込み保証 (write concern) のソースを示す以下のフィールドも含むことができます。

delete.writeConcernError.errInfo.writeConcern.provenance

書込み保証 (write concern) が発生した場所を示す文字列値です(書込み保証 (write concern) provenance と呼ばれます)。次の表は、このフィールドに指定できる値とその意味を示しています。

出所
説明
clientSupplied
書き込み保証(write concern)がアプリケーションで指定されました。
customDefault
書込み保証 (write concern) は、カスタム定義されたデフォルト値に基づきます。setDefaultRWConcern を参照してください。
getLastErrorDefaults
書込み保証 (write concern) は、レプリカセットの settings.getLastErrorDefaults のフィールドに基づきます。
implicitDefault
他の書き込み保証(write concern)が一切指定されていない状態で、サーバーから発生した書き込み保証。

以下は、delete コマンドが成功した場合に返されるドキュメントの例です。

{ ok: 1, n: 1 }

以下は、 hintフィールドに存在しないインデックスを指定したためにエラーが発生したdeleteコマンドで返されるドキュメントの例です。

{
n: 0,
writeErrors: [
{
index: 0,
code: 2,
errmsg: 'error processing query: ns=test.products: hat $eq "bowler"\n' +
'Sort: {}\n' +
'Proj: {}\n' +
' planner returned error :: caused by :: hint provided does not correspond to an existing index'
}
],
ok: 1
}

戻る

クエリと書込み