MongoDBの$pull演算子で複数の条件に一致する配列要素を削除する方法
配列から特定の条件に一致する要素をまとめて削除したい場合、MongoDBでは$pull演算子とupdateメソッドを組み合わせるのが効果的です。この記事では、実際にサンプルコレクションを作成しながら、条件を指定した配列要素の一括削除手順をわかりやすく解説します。
1. サンプルコレクションの作成
まず、ドキュメントを格納したコレクションを作成します。
> db.demo198.insertOne({"List":{"Values":[10,20,30,30,70,80,90]}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3c224503d395bdc21346df")
}
> db.demo198.insertOne({"List":{"Values":[56,978,56,34,23,34]}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3c225403d395bdc21346e0")
}
> db.demo198.insertOne({"List":{"Values":[21,12,14,15,34,56]}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3c226603d395bdc21346e1")
}2. 作成したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo198.find();
上記のコマンドを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e3c224503d395bdc21346df"), "List" : { "Values" : [ 10, 20, 30, 30, 70, 80, 90 ] } }
{ "_id" : ObjectId("5e3c225403d395bdc21346e0"), "List" : { "Values" : [ 56, 978, 56, 34, 23, 34 ] } }
{ "_id" : ObjectId("5e3c226603d395bdc21346e1"), "List" : { "Values" : [ 21, 12, 14, 15, 34, 56 ] } }3. $pull演算子による条件付き削除クエリ
続いて、$pull演算子を使って「40未満の値」をすべてのドキュメントから削除するクエリを見ていきます。第3引数に{ "multi": true }を指定することで、条件に一致したすべてのドキュメントに対して更新処理が適用される点がポイントです。
> db.demo198.update({},{ "$pull": { "List.Values": { "$lt": 40 } } },{ "multi": true });
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })実行結果を見ると、3件すべてのドキュメントが一致し(nMatched: 3)、3件とも更新されている(nModified: 3)ことがわかります。
4. 更新後のドキュメントを確認する
もう一度find()メソッドを実行して、更新結果を確認しましょう。
> db.demo198.find();
実行すると、以下のような出力になります。
{ "_id" : ObjectId("5e3c224503d395bdc21346df"), "List" : { "Values" : [ 70, 80, 90 ] } }
{ "_id" : ObjectId("5e3c225403d395bdc21346e0"), "List" : { "Values" : [ 56, 978, 56 ] } }
{ "_id" : ObjectId("5e3c226603d395bdc21346e1"), "List" : { "Values" : [ 56 ] } }このように、10、20、30、34、23、12、14、15といった40未満の値がすべて配列から取り除かれ、40以上の値だけが残っていることが確認できます。重複していた値(例:30や56)も条件に一致すればまとめて削除される点にも注目してください。
補足:updateMany()の活用と$unsetとの違い
MongoDB 4.2以降では、update()メソッドにmulti: trueを指定する代わりに、より簡潔なupdateMany()メソッドの使用が推奨されています。同じ処理は次のように書けます。
> db.demo198.updateMany({}, { "$pull": { "List.Values": { "$lt": 40 } } });また、タイトルにある$unsetはフィールド自体を削除(未定義化)するための演算子であり、配列内の特定の要素だけを条件で取り除く用途には$pullの方が適しています。目的に応じて両者を使い分けるとよいでしょう。
-
MongoDBで大文字と小文字を区別せずに検索する方法($regexの使い方)
MongoDBで大文字と小文字を区別しない(ケースインセンシティブな)検索を実行したい場合は、find()メソッドの中で正規表現($regex)を使用します。基本となる構文は以下の通りです。db.demo572.find({yourFieldName : { $regex : /^yourValue$/i}});正規表現のポイントこの構文で重要なのは、パターンの末尾に付ける「i」オプションです。このフラグを指定することで、マッチング時に大文字と小文字の違いが無視されます。また、^(先頭)と$(末尾)で値を囲むことで、部分一致ではなく完全一致の検索になります。それでは、実際にサンプルコレクション
-
MongoDBの$or演算子で複数条件に一致するドキュメントを取得する方法
はじめにMongoDBでは、$or演算子を使うことで、複数の条件のうちいずれか1つでも一致したドキュメントを取得できます。本記事では、サンプルコレクションを作成し、$or演算子を用いたOR条件検索の具体的な方法を解説します。サンプルコレクションの作成まず、insertOne()メソッドを使って、demo711というコレクションにドキュメントを挿入していきましょう。> db.demo711.insertOne({Name:"John","Marks":75,Age:21,status:"Active"}); { "