MongoDBでネストされた配列に新しいアイテムを追加する方法【コード例付き】
MongoDBでネストされた配列(オブジェクトの配列)に新しいアイテムやフィールドを追加したい場合、find()とupdate()を組み合わせることで実現できます。この記事では、実際のコード例を通じて、その手順をわかりやすく解説します。
1. コレクションの作成
まずは、サンプルとなるドキュメントを含むコレクションを作成します。insertOne()メソッドを使用して、「ProjectDetails」というネストされた配列を持つドキュメントを挿入しましょう。
> db.demo124.insertOne(
... {
... "Name" : "John",
... "Id" : 101,
... "ProjectDetails" : [{
... "ProjectName1" : "Online Book",
... "ProjectName2" : "Online Banking"
... }, {
... "ProjectName1" : "Online Library Management System",
... "ProjectName2" : "School Management System"
... }]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2f2c8b140daf4c2a3544bb")
}
2. 挿入したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo124.find();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e2f2c8b140daf4c2a3544bb"), "Name" : "John", "Id" : 101, "ProjectDetails" : [
{ "ProjectName1" : "Online Book", "ProjectName2" : "Online Banking" },
{ "ProjectName1" : "Online Library Management System", "ProjectName2" : "School Management System" }
]
}
3. ネストされた配列に新しいアイテムを追加する
それでは、ネストされた配列「ProjectDetails」の各要素に、新しいフィールド「ProjectName3」を追加していきます。以下のように、find().toArray().forEach()で各ドキュメントをループ処理し、配列内のすべての要素に新しいキーと値を設定したうえで、update()によってドキュメントを更新します。
> db.demo124.find().toArray().forEach(
... function(d){
... for(var i = 0; i< d.ProjectDetails.length; ++i) {
... d.ProjectDetails[i]['ProjectName3'] = 'Online Snake Game';
... }
... db.demo124.update({_id: d._id}, d);
... }
... );
4. 更新結果の確認
更新後、再度find()メソッドでドキュメントを表示し、結果を確認します。
> db.demo124.find().pretty();
実行すると、次のような出力が得られます。配列の各要素に「ProjectName3」が追加されていることがわかります。
{
"_id" : ObjectId("5e2f2c8b140daf4c2a3544bb"),
"Name" : "John",
"Id" : 101,
"ProjectDetails" : [
{
"ProjectName1" : "Online Book",
"ProjectName2" : "Online Banking",
"ProjectName3" : "Online Snake Game"
},
{
"ProjectName1" : "Online Library Management System",
"ProjectName2" : "School Management System",
"ProjectName3" : "Online Snake Game"
}
]
}
補足:より現代的なアプローチ
上記の例ではJavaScriptのループ処理を使用していますが、MongoDB 3.6以降では、全位置演算子 $[] を使うことで、よりシンプルに記述できます。
db.demo124.updateMany(
{},
{ $set: { "ProjectDetails.$[].ProjectName3": "Online Snake Game" } }
);
この方法なら、サーバー側で一括更新が行われるため、大量のデータを扱う場合でもパフォーマンス面で有利です。また、古いバージョンで使われていたupdate()は非推奨となっているため、現在ではupdateOne()やupdateMany()の使用が推奨されています。用途に応じて適切な方法を選択しましょう。
-
MongoDBで各グループごとの最大値を持つドキュメントを取得する方法
MongoDBでは、集計パイプラインの $group ステージと $max 演算子を組み合わせることで、特定のフィールドでグループ化した各グループの中から最大値を持つアイテムを簡単に取得できます。この記事では、実際のコレクションを作成しながら、その手順を具体的に解説します。1. サンプルコレクションの作成まず、insertOne() メソッドを使って、名前・国名・点数を持つドキュメントを複数件挿入したサンプルコレクションを作成します。> db.demo659.insertOne({Name:"Chris",CountryName:"US",&quo
-
MongoDBアグリゲーションで配列内の要素サブセットを合計する方法
MongoDBのアグリゲーションパイプラインを使用して、配列内の一部の要素(サブセット)を合計したい場合があります。そんなときは、$first演算子と$sum演算子を組み合わせることで実現できます。この記事では、実際のコレクションを作成しながら、具体的な手順をサンプルコード付きでわかりやすく解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。以下の例では、数値の配列「Values」を持つドキュメントをinsertOne()メソッドで挿入しています。> db.demo610.insertOne({Values:[10,20,30,40,50]}