MongoDBの配列から複数のオブジェクトを$pull演算子で削除する方法
MongoDBの配列から複数のオブジェクトを削除する方法
MongoDBでは、$pull 演算子を使うことで、配列から条件に一致する要素をすべて削除できます。さらに $in 演算子と組み合わせれば、複数の値に一致するオブジェクトを一度の操作でまとめて取り除くことも可能です。
この記事では、実際のコード例を通して、配列から複数のオブジェクトを削除する手順を詳しく解説します。
1. サンプルコレクションの作成
まずは、テスト用のコレクションを作成します。以下のように insertOne() メソッドを使ってドキュメントを挿入しましょう。
> db.pullMultipleObjectsDemo.insertOne(
... {
... "ClientId" : "100",
... "ClientName" : "John",
... "ClientPersonalDetails" : [
... {
... "ClientCountryName" : "US",
... "ClientProjectName" : "Online Book Store"
... },
... {
... "ClientCountryName" : "AUS",
... "ClientProjectName" : "Online Fee Management"
... },
... {
... "ClientCountryName" : "UK",
... "ClientProjectName" : "Online Pig Dice Game"
... },
... {
... "ClientCountryName" : "ANGOLA",
... "ClientProjectName" : "Online Hospital Management"
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc7d0748f9e6ff3eb0ce43d")
}
このコレクションには「ClientPersonalDetails」という配列フィールドがあり、各国のプロジェクト情報を表す4つのオブジェクトが格納されています。
2. ドキュメントの内容を確認する
find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.pullMultipleObjectsDemo.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5cc7d0748f9e6ff3eb0ce43d"),
"ClientId" : "100",
"ClientName" : "John",
"ClientPersonalDetails" : [
{
"ClientCountryName" : "US",
"ClientProjectName" : "Online Book Store"
},
{
"ClientCountryName" : "AUS",
"ClientProjectName" : "Online Fee Management"
},
{
"ClientCountryName" : "UK",
"ClientProjectName" : "Online Pig Dice Game"
},
{
"ClientCountryName" : "ANGOLA",
"ClientProjectName" : "Online Hospital Management"
}
]
}
3. $pull と $in で複数のオブジェクトを削除する
ここからが本題です。配列から複数のオブジェクトを削除するには、$pull の条件に $in を組み合わせます。以下のクエリでは、「Online Book Store」と「Online Pig Dice Game」に一致するプロジェクト名を持つオブジェクトをまとめて削除しています。
> db.pullMultipleObjectsDemo.update(
... {"_id": ObjectId("5cc7d0748f9e6ff3eb0ce43d")},
... {"$pull":{"ClientPersonalDetails":{"ClientProjectName":{$in:["Online Book Store","Online Pig Dice Game"]}}}}
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
nModified : 1 と表示されていることから、1件のドキュメントが正常に更新されたことがわかります。
なお、MongoDBの新しいバージョンでは update() メソッドは非推奨となっているため、実際の開発では updateOne() や updateMany() の使用が推奨されています。
4. 削除結果の確認
オブジェクトが正しく配列から削除されたかどうかを確認するため、もう一度すべてのドキュメントを表示してみましょう。
> db.pullMultipleObjectsDemo.find().pretty();
実行結果は次のとおりです。
{
"_id" : ObjectId("5cc7d0748f9e6ff3eb0ce43d"),
"ClientId" : "100",
"ClientName" : "John",
"ClientPersonalDetails" : [
{
"ClientCountryName" : "AUS",
"ClientProjectName" : "Online Fee Management"
},
{
"ClientCountryName" : "ANGOLA",
"ClientProjectName" : "Online Hospital Management"
}
]
}
出力を見ると、「Online Book Store」と「Online Pig Dice Game」の2つのオブジェクトが配列から削除され、残りの2つだけが残っていることが確認できます。
まとめ
配列から複数のオブジェクトを削除したい場合は、$pull 演算子の中で $in を使い、複数の一致条件を指定するのがポイントです。この方法なら、1回の更新操作で条件に合致するすべてのオブジェクトを効率的に取り除くことができます。
-
MongoDBでオブジェクトの配列を検索できますか?
MongoDBでオブジェクト配列を検索する方法はい、MongoDBではオブジェクトの配列を検索することが可能です。集計パイプライン(aggregate())の中で$unwindを使って配列を展開し、$matchで条件に一致する要素を抽出します。ここでは、実際の手順をサンプルコードとともに解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne()メソッドを使って、オブジェクト配列を含むドキュメントをコレクションに登録します。> db.demo623.insertOne( ... { ... _id:1, ... details:
-
MongoDBでオブジェクトの配列内の複数条件に一致するドキュメントを検索する方法($andと$regex活用)
MongoDBでオブジェクト(サブドキュメント)の配列内から、複数の条件を同時に満たすドキュメントを検索したい場合は、$and演算子と$regex演算子、さらに$elemMatchを組み合わせるのが効果的です。$andは、1つ以上の式からなる配列に対して論理AND演算を実行し、配列内のすべての条件を満たすドキュメントだけを選択します。また、$elemMatchを使うことで、配列内の同一要素が複数条件を満たすかどうかを正確に判定できます。サンプルコレクションの作成まず、検証用のコレクションを作成してドキュメントを挿入してみましょう。> db.demo525.insertOne({detai