MongoDBのネストされた配列に$push演算子で新しいドキュメントを追加する方法
MongoDBでは、$push演算子を使うことで、ネストされた配列(入れ子構造の配列)の中に新しいドキュメントを追加できます。この記事では、具体的なサンプルコードとともに、ネストされた配列への$pushの使い方をわかりやすく解説します。
ネストされた配列を持つコレクションを作成する
まずは、$pushの動作を確認するために、ネストされた配列を含むドキュメントを持つコレクションを作成しましょう。以下のクエリを実行します。
>db.nestedArrayDemo.insertOne({"EmployeeName":"Larry","EmployeeSalary":9000,"EmployeeDetails":
[{"EmployeeDOB":new Date('1990-01-21'),"EmployeeDepartment":"ComputerScience","EmployeeProject":
[{"Technology":"C","Duration":6},{"Technology":"Java","Duration":7}]}]});
このクエリを実行すると、次のような出力が得られます。
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6d73090c3d5054b766a76e")
}
find()メソッドでドキュメントを確認する
次に、find()メソッドを使って、作成したコレクション内のドキュメントを表示してみましょう。
> db.nestedArrayDemo.find().pretty();
実行結果は以下の通りです。
{
"_id" : ObjectId("5c6d73090c3d5054b766a76e"),
"EmployeeName" : "Larry",
"EmployeeSalary" : 9000,
"EmployeeDetails" : [
{
"EmployeeDOB" : ISODate("1990-01-21T00:00:00Z"),
"EmployeeDepartment" : "ComputerScience",
"EmployeeProject" : [
{
"Technology" : "C",
"Duration" : 6
},
{
"Technology" : "Java",
"Duration" : 7
}
]
}
]
}
このように、「EmployeeDetails」配列の中に「EmployeeProject」というさらに深い配列が存在する、2段階のネスト構造になっています。
$pushと位置演算子$を使ってネストされた配列に追加する
それでは、$push演算子を使って、ネストされた配列「EmployeeProject」に新しいドキュメントを追加してみます。ポイントは、位置演算子 $ を使って、条件に一致した配列要素を指定することです。クエリは以下のようになります。
>db.nestedArrayDemo.update({"_id":ObjectId("5c6d73090c3d5054b766a76e"),
"EmployeeDetails.EmployeeDepartment":"ComputerScience"}, {"$push":
{"EmployeeDetails.$.EmployeeProject": {"Technology":"Python", "Duration":4 }}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
このクエリでは、更新条件として「EmployeeDepartment」が「ComputerScience」である要素を指定し、位置演算子$によってその配列要素を特定しています。そして、その中の「EmployeeProject」配列に対して、新しいドキュメント {"Technology":"Python", "Duration":4 } を$pushで追加しています。
nModified : 1 と表示されていることから、1件のドキュメントが正常に更新されたことがわかります。
更新後のドキュメントを確認する
もう一度find()メソッドを実行して、更新後のドキュメントを確認してみましょう。
> db.nestedArrayDemo.find().pretty();
実行結果は以下の通りです。
{
"_id" : ObjectId("5c6d73090c3d5054b766a76e"),
"EmployeeName" : "Larry",
"EmployeeSalary" : 9000,
"EmployeeDetails" : [
{
"EmployeeDOB" : ISODate("1990-01-21T00:00:00Z"),
"EmployeeDepartment" : "ComputerScience",
"EmployeeProject" : [
{
"Technology" : "C",
"Duration" : 6
},
{
"Technology" : "Java",
"Duration" : 7
},
{
"Technology" : "Python",
"Duration" : 4
}
]
}
]
}
ご覧の通り、「EmployeeProject」配列の末尾に、新しく {"Technology" : "Python", "Duration" : 4} のドキュメントが追加されました。
まとめ
ネストされた配列に要素を追加する場合は、$push演算子に加えて位置演算子$を組み合わせることで、条件に一致した配列要素を正確に特定して更新できます。この手法を覚えておくと、複雑な入れ子構造のドキュメントでも柔軟にデータを操作できるようになります。
-
MongoDBの$push演算子で配列を更新する方法
MongoDBで配列に要素を追加・更新するには、$push 演算子と updateOne() メソッドを組み合わせて使用します。この記事では、実際のコード例を通じて、ネストされた配列内の特定のドキュメントを $push で更新する手順を解説します。サンプルコレクションの作成まず、insertOne() メソッドを使って、ドキュメントを含むコレクションを作成します。> db.demo526.insertOne( ... { ... CountryName: US, ... TeacherName: Bob, ... StudentInformation: [ ...
-
MongoDBでネストされた配列にフィルタリング条件を設定する方法($filterと$condの使い方)
MongoDBでネストされた配列にフィルタリング条件を設定するにはMongoDBのaggregate()内で$filterと$condを使用すると、配列に対して柔軟なフィルタリング条件を設定できます。$filterは、指定した条件に基づいて配列の部分集合(条件を満たす要素のみ)を返却する演算子です。さらに、内部で$mapや$anyElementTrue、$indexOfBytesなどを組み合わせることで、ネストされた配列の中から特定の値を持つ要素だけを抽出できます。この記事では、「Messages」というネストされた配列の中から、特定の文字列(Hello)を含むドキュメントだけを絞り込む方法を