MongoDBで$pull演算子と位置演算子($)を組み合わせてネスト配列の要素を削除する方法
MongoDBでは、$pull演算子を位置演算子($)と組み合わせることで、ネストされた配列から条件に一致する特定の要素を削除できます。本記事では、実際のコード例をもとに、その手順をわかりやすく解説します。
コレクションの作成
まず、ドキュメントを含むコレクションを作成します。以下の例では、学生情報(StudentDetails)の中に、好きな科目(StudentFavouriteSubject)の配列がネストされた構造を持つドキュメントを挿入しています。
> db.pullWithPositionalOperatorDemo.insertOne(
... {
... _id: 100,
... "StudentDetails": [
... {
... "StudentId": "STU-1",
... "StudentFavouriteSubject": ["MongoDB", "Java"]
... },
... {
... "StudentId": "STU-2",
... "StudentFavouriteSubject": ["PHP", "MySQL"]
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 100 }
挿入したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.pullWithPositionalOperatorDemo.find().pretty();
このクエリを実行すると、次のような出力が得られます。
{
"_id" : 100,
"StudentDetails" : [
{
"StudentId" : "STU-1",
"StudentFavouriteSubject" : [
"MongoDB",
"Java"
]
},
{
"StudentId" : "STU-2",
"StudentFavouriteSubject" : [
"PHP",
"MySQL"
]
}
]
}
$pull演算子と位置演算子による更新処理
それでは、$pull演算子と位置演算子を組み合わせた更新クエリを実行します。ここでは、「StudentId」が「STU-2」であり、かつ「StudentFavouriteSubject」に「MySQL」が含まれる要素を対象に、「MySQL」を配列から削除します。
> db.pullWithPositionalOperatorDemo.update({
... "StudentDetails" : {
... "$elemMatch" : {
... "StudentId" : "STU-2",
... "StudentFavouriteSubject" : "MySQL"
... }
... }
... }, {
... $pull : {
... "StudentDetails.$.StudentFavouriteSubject" : "MySQL"
... }
... }, {
... multi : true
... });
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
クエリのポイント
このクエリの重要なポイントは以下の2点です。
- $elemMatch:クエリ側で「どの配列要素を対象にするか」を指定します。ここではStudentIdが「STU-2」で、好きな科目に「MySQL」を含む要素を特定しています。
- 位置演算子($):更新側で「StudentDetails.$.StudentFavouriteSubject」と記述することで、クエリに一致した配列要素の位置が自動的に判別され、その中の配列から「MySQL」が削除されます。
更新結果の確認
もう一度find()メソッドを実行して、更新後のドキュメントを確認してみましょう。
> db.pullWithPositionalOperatorDemo.find().pretty();
実行結果は次の通りです。
{
"_id" : 100,
"StudentDetails" : [
{
"StudentId" : "STU-1",
"StudentFavouriteSubject" : [
"MongoDB",
"Java"
]
},
{
"StudentId" : "STU-2",
"StudentFavouriteSubject" : [
"PHP"
]
}
]
}
出力結果を見ると、「STU-2」の「StudentFavouriteSubject」配列から「MySQL」のみが削除され、「PHP」が残っていることが確認できます。このように、$pullと位置演算子を組み合わせれば、複雑なネスト構造を持つ配列からでも柔軟に要素を取り除くことが可能です。
補足:arrayFiltersを使った代替手段
なお、MongoDB 3.6以降では、フィルタリングされた位置演算子($[identifier])とarrayFiltersを組み合わせる方法も利用できます。こちらの方が複数階層のネストや複雑な条件にも対応しやすいため、新しいプロジェクトでは併せて検討するとよいでしょう。
-
MongoDBで条件付きの文字列連結を行う方法($condと$concatの使い方)
MongoDBで条件付きの文字列連結を実現する方法 MongoDBでは、$cond演算子の中で$concatを組み合わせることで、条件に基づいた文字列の連結とドキュメントのフィルタリングが可能です。本記事では、実際のコード例を通じて、その実装手順をわかりやすく解説します。 サンプルコレクションの作成 まず、ドキュメントを格納するコレクションを作成します。insertOne()メソッドを使って、3件のドキュメントを挿入してみましょう。 > db.demo745.insertOne({Value1:100,Value2:100}); { acknowledged : true,
-
MongoDBの$push演算子を使って配列に要素を追加する方法
MongoDBの$push演算子とはMongoDBの$push演算子は、ドキュメント内の配列フィールドに対して新しい要素を追加するための更新演算子です。既存の配列の末尾に値を追加できるため、リスト形式のデータを扱う際に非常に便利です。この記事では、実際のコード例を通して、$push演算子の基本的な使い方を解説します。1. コレクションとドキュメントを作成するまず、insertOne()メソッドを使用して、コレクションにドキュメントを挿入します。ここでは「Subjects」という配列フィールドを持つ2つのドキュメントを作成します。> db.demo738.insertOne({Subjec