db.collection.deleteMany()
MongoDB とドライバー
このページではmongosh
メソッドがドキュメントされています。 MongoDB ドライバーで同等のメソッドを確認するには、プログラミング言語の対応するページを参照してください。
定義
db.collection.deleteMany()
Removes all documents that match the
filter
from a collection.次の値を返します。 次の要素を含むドキュメント: 操作が書き込み保証
付きで実行された場合はブール値
acknowledged
(true
)、書き込み保証が無効になっている場合はfalse
になります削除されたドキュメントの数を含む
deletedCount
注意
大きなコレクション内の全ドキュメントを削除する場合は、コレクションを削除して再作成する方が速い場合があります。コレクションを削除する前に、コレクションのすべてのインデックスに注意してください。元のコレクションに存在していたインデックスをすべて再作成する必要があります。元のコレクションがシャーディングされている場合は、再作成されたコレクションもシャーディングする必要があります。
コレクションの削除について詳しくは、db.collection.drop()
を参照してください。
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
deleteMany()
メソッドの構文は次のとおりです。
db.collection.deleteMany( <filter>, { writeConcern: <document>, collation: <document> } )
Parameter | タイプ | 説明 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
ドキュメント | クエリ演算子を使用して削除条件を指定します。 To delete all documents in a collection, pass in an empty
document ( | |||||||||||
ドキュメント | 任意。書込み保証(write concern)を表現するドキュメント。デフォルトの書込み保証を使用する場合は省略します。 トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。 | |||||||||||
ドキュメント | 任意。 操作に使用する照合を指定します。 照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。 照合オプションの構文は次のとおりです。
照合を指定する場合、 照合が指定されていなくても、コレクションにデフォルトの照合が設定されている場合( コレクションにも操作にも照合が指定されていない場合、MongoDB では以前のバージョンで使用されていた単純なバイナリ比較によって文字列が比較されます。 1 つの操作に複数の照合は指定できません。たとえば、フィールドごとに異なる照合を指定できません。また、ソートと検索を一度に実行する場合、検索とソートで別の照合を使用できません。 | |||||||||||
ドキュメント | Optional. A document or string that specifies the index to use to support the クエリ述語. このオプションには、インデックス仕様ドキュメントまたはインデックス名の文字列を指定できます。 存在しないインデックスを指定した場合、操作はエラーになります。 の例については、「 |
動作
シャーディングされたコレクション
deleteMany()
がトランザクションの外で実行されると、複数のシャードを対象とする操作は、クラスター内のすべてのシャードに適用されます。deleteMany()
がトランザクション内で実行される場合、複数のシャードを対象とする操作は、関連するシャードのみを対象とします。
時系列コレクション
db.collection.deleteMany()
throws a WriteError
exception
if used on a 時系列コレクション. To remove all documents
from a time series collection, use db.collection.drop()
.
単一ドキュメントの削除
To delete a single document, use db.collection.deleteOne()
instead.
Alternatively, use a field that is a part of a 一意なインデックス such as
_id
.
トランザクション
db.collection.deleteMany()
は分散トランザクション内で使用できます。
トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。
重要
ほとんどの場合、分散トランザクションでは 1 つのドキュメントの書き込み (write) よりもパフォーマンス コストが高くなります。分散トランザクションの可用性は、効果的なスキーマ設計の代わりにはなりません。多くのシナリオにおいて、非正規化されたデータモデル(埋め込みドキュメントと配列)が引き続きデータやユースケースに最適です。つまり、多くのシナリオにおいて、データを適切にモデリングすることで、分散トランザクションの必要性を最小限に抑えることができます。
トランザクションの使用に関するその他の考慮事項(ランタイム制限や oplog サイズ制限など)については、「本番環境での考慮事項」も参照してください。
Primary Node Failure
db.collection.deleteMany()
deletes documents one at a time.
If the primary node fails during a db.collection.deleteMany()
operation, documents that were not yet deleted from secondary nodes are
not deleted from the collection.
Oplog エントリ
If a db.collection.deleteMany()
operation successfully deletes one
or more documents, the operation adds an entry for each deleted document
on the oplog (operations log). If the operation fails or does
not find any documents to delete, the operation does not add an entry on
the oplog.
例
Delete Multiple Documents
orders
コレクションには、次の構造を持つドキュメントがあります。
db.orders.insertOne( { _id: ObjectId("563237a41a4d68582c2509da"), stock: "Brent Crude Futures", qty: 250, type: "buy-limit", limit: 48.90, creationts: ISODate("2015-11-01T12:30:15Z"), expiryts: ISODate("2015-11-01T12:35:15Z"), client: "Crude Traders Inc." } )
The following operation deletes all documents where client : "Crude Traders
Inc."
:
try { db.orders.deleteMany( { "client" : "Crude Traders Inc." } ); } catch (e) { print (e); }
この操作では以下が返されます。
{ "acknowledged" : true, "deletedCount" : 10 }
The following operation deletes all documents where stock : "Brent Crude
Futures"
and limit
is greater than 48.88
:
try { db.orders.deleteMany( { "stock" : "Brent Crude Futures", "limit" : { $gt : 48.88 } } ); } catch (e) { print (e); }
この操作では以下が返されます。
{ "acknowledged" : true, "deletedCount" : 8 }
deleteMany() with Write Concern
3つのノードから成るレプリカセットにおいて、次の操作は w
の majority
と wtimeout
の 100
を指定します。
try { db.orders.deleteMany( { "client" : "Crude Traders Inc." }, { writeConcern: { w : "majority", wtimeout : 100 }} ); } catch (e) { print (e); }
承認に wtimeout
制限時間を超える時間がかかると、次の例外が発生します。
WriteConcernError({ "code" : 64, "errmsg" : "waiting for replication timed out", "errInfo" : { "wtimeout" : true, "writeConcern" : { "w" : "majority", "wtimeout" : 100, "provenance" : "getLastErrorDefaults" } } })
以下も参照してください。
照合の指定
照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。
コレクション restaurants
は、次のドキュメントを含みます。
db.restaurants.insertMany( [ { _id: 1, category: "café", status: "A" }, { _id: 2, category: "cafe", status: "a" }, { _id: 3, category: "cafE", status: "a" } ] )
次の操作には照合オプションが含まれます。
db.restaurants.deleteMany( { category: "cafe", status: "A" }, { collation: { locale: "fr", strength: 1 } } )
削除操作の hint
を指定する
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.members.deleteMany( { "points": { $lte: 20 }, "status": "P" }, { hint: { status: 1 } } )
注意
存在しないインデックスを指定した場合、操作はエラーになります。
delete コマンドは以下を返します。
{ "acknowledged" : true, "deletedCount" : 3 }
使用されているインデックスを表示するには、$indexStats
パイプラインを使用できます。
db.members.aggregate( [ { $indexStats: { } }, { $sort: { name: 1 } } ] )
$indexStats
出力の
accesses.ops
フィールドには、インデックスを使用した操作の数が表示されます。