MongoDBで配列から複数の値を一括削除する方法:$pull演算子とmultiオプションの使い方
配列から値を取り除く(プルする)には、$pull 演算子を使用し、multi: true を設定します。multi オプションを有効にすることで、条件に一致したすべてのドキュメントに対して同時に更新を適用できます。
本記事では、実際にコレクションを作成し、$pull を使って複数のドキュメントの配列から特定の値を一括削除する手順を解説します。
サンプルコレクションの作成
まずは、ドキュメントを含むコレクションを作成しましょう。
> db.demo392.insertOne(
... {
... Name: 'Chris',
... details: [
... {
... _id: '101'
... },
... {
... _id: '102'
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5d2b3322064be7ab44e802")
}
>
> db.demo392.insertOne(
... {
... Name: 'Chris',
... details: [
... {
... _id: '104'
... },
... {
... _id: '101'
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5d2b3422064be7ab44e803")
}ここでは「Chris」という名前のドキュメントを2件作成し、それぞれの details 配列に異なる _id の要素を格納しています。ポイントは、両方のドキュメントに _id「101」が含まれていることです。
登録されたドキュメントの確認
find() メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo392.find();
上記のコマンドを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e5d2b3322064be7ab44e802"), "Name" : "Chris", "details" : [
{ "_id" : "101" }, { "_id" : "102" }
]
}
{
"_id" : ObjectId("5e5d2b3422064be7ab44e803"), "Name" : "Chris", "details" : [
{ "_id" : "104" }, { "_id" : "101" }
]
}$pull を使った配列からの値の一括削除
続いて、配列から $pull を使って値を削除するクエリを見ていきましょう。この例では、details 配列内の _id が「101」である要素を、すべてのドキュメントから一括して削除しています。
> db.demo392.update(
... { },
... { $pull: { details: { _id: '101' } } },
... { multi: true }
... )
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })各引数の意味は以下の通りです。
- 第1引数
{ }:空のフィルターを指定することで、コレクション内の全ドキュメントが対象になります。 - 第2引数
{ $pull: ... }:details 配列から_idが「101」の要素を削除します。 - 第3引数
{ multi: true }:条件に一致したすべてのドキュメントに更新を適用します。これを指定しない場合、最初の1件しか更新されません。
実行結果の WriteResult({ "nMatched" : 2, "nModified" : 2 }) を見ると、2件のドキュメントが一致し、両方とも正常に更新されたことがわかります。
補足: MongoDB 4.2 以降では update() は非推奨となっています。新しいバージョンでは、同等の処理を db.demo392.updateMany({ }, { $pull: { details: { _id: '101' } } }) のように updateMany() で書くのが推奨されます。updateMany() は常に複数ドキュメントを対象とするため、multi オプションの指定も不要です。
削除後の結果確認
もう一度 find() メソッドで全ドキュメントを表示して、結果を確認してみましょう。
> db.demo392.find();
実行結果は以下の通りです。
{ "_id" : ObjectId("5e5d2b3322064be7ab44e802"), "Name" : "Chris", "details" : [ { "_id" : "102" } ] }
{ "_id" : ObjectId("5e5d2b3422064be7ab44e803"), "Name" : "Chris", "details" : [ { "_id" : "104" } ] }出力を見ると、両方のドキュメントから _id が「101」の要素が完全に削除され、残りの要素だけが配列に保持されていることが確認できます。
まとめ
$pull 演算子に multi: true を組み合わせることで、複数のドキュメントにまたがる配列から、条件に一致する要素を一度に削除できます。特定の ID や値を持つ要素をまとめて整理したい場合に非常に便利なテクニックなので、ぜひ活用してください。
-
MongoDBでサブドキュメントの配列をクエリする方法
MongoDBでサブドキュメントの配列をクエリするには、集計パイプラインの$unwindを使用します。$unwindは、配列フィールドを展開し、配列の各要素ごとに個別のドキュメントを生成するステージです。これにより、配列内のサブドキュメントを個別にフィルタリングできるようになります。ここでは、大学の情報を含むコレクションを作成し、その中から特定の条件に一致するサブドキュメントを抽出する手順を解説します。コレクションの作成まず、insertOne()メソッドを使って、サブドキュメントの配列を含むドキュメントを挿入しましょう。> db.demo499.insertOne({... "
-
MongoDBでコレクションから配列フィールド全体を削除するクエリの書き方
MongoDBで配列フィールドを完全に削除するにはMongoDBのコレクションから、ドキュメント内の配列フィールドそのもの(フィールドごと)を取り除きたい場合は、更新演算子の $unset を使用します。$unset は指定したフィールドをドキュメントから削除する演算子で、配列の中身だけを空にするのではなく、フィールド自体が存在しない状態にできます。ここでは、サンプルコレクションを作成して、実際に配列フィールドを削除する手順を見ていきましょう。1. サンプルコレクションの作成まず、insertOne() メソッドを使ってドキュメントを挿入し、テスト用のコレクション demo609 を作成します