MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBでネストされた配列内の値をインクリメントする方法

MongoDBでネストされた配列内の値をインクリメントする方法

MongoDBでは、位置演算子「$」と「$inc」演算子を組み合わせることで、ネストされた配列内の特定の要素の値を簡単にインクリメント(増加)できます。本記事では、サンプルコレクションを使いながら、その具体的な手順をわかりやすく解説します。

1. ドキュメントを含むコレクションの作成

まず、概念を理解するために、insertOne() メソッドを使用してサンプルドキュメントを持つコレクションを作成します。以下のクエリを実行してください。

> db.incrementValueInNestedArrayDemo.insertOne(
   ... {
   ...    "UniqueId":1,
   ...    "StudentDetails":[
   ...       {
   ...          "StudentId":101,
   ...          "StudentMarks":97
   ...       },
   ...       {
   ...          "StudentId":103,
   ...          "StudentMarks":99
   ...       },
   ...       {
   ...          "StudentId":105,
   ...          "StudentMarks":92
   ...       },
   ...       {
   ...          "StudentId":107,
   ...          "StudentMarks":59
   ...       }
   ...    ]
   ... }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c77dd71fc4e719b197a12f7")
}

このコレクションには、学生ID(StudentId)と点数(StudentMarks)からなる「StudentDetails」というネストされた配列が含まれています。

2. コレクション内の全ドキュメントを表示する

find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。pretty() を付けると、結果が整形されて読みやすくなります。

> db.incrementValueInNestedArrayDemo.find().pretty();

実行結果は以下の通りです。

{
   "_id" : ObjectId("5c77dd71fc4e719b197a12f7"),
   "UniqueId" : 1,
   "StudentDetails" : [
      {
         "StudentId" : 101,
         "StudentMarks" : 97
      },
      {
         "StudentId" : 103,
         "StudentMarks" : 99
      },
      {
         "StudentId" : 105,
         "StudentMarks" : 92
      },
      {
         "StudentId" : 107,
         "StudentMarks" : 59
      }
   ]
}

3. ネストされた配列内の値をインクリメントする

それでは、ネストされた配列内の値をインクリメントしてみましょう。ポイントは、条件に合致した最初の配列要素を参照する位置演算子「$」です。ここでは、StudentId が 107 の学生の点数を 1 増やします。

> db.incrementValueInNestedArrayDemo.update({UniqueId:1,"StudentDetails.StudentId":107},
{$inc:{"StudentDetails.$.StudentMarks":1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

nMatched: 1nModified: 1 という結果から、該当するドキュメントが1件見つかり、正常に更新されたことがわかります。

4. 更新結果の確認

StudentId 107 の点数が正しくインクリメントされているか、再度 find() メソッドで確認しましょう。

> db.incrementValueInNestedArrayDemo.find().pretty();

実行結果は以下の通りです。

{
   "_id" : ObjectId("5c77dd71fc4e719b197a12f7"),
   "UniqueId" : 1,
   "StudentDetails" :
   [
      {
         "StudentId" : 101,
         "StudentMarks" : 97
      },
      {
         "StudentId" : 103,
         "StudentMarks" : 99
      },
      {
         "StudentId" : 105,
         "StudentMarks" : 92
      },
      {
         "StudentId" : 107,
         "StudentMarks" : 60
      }
   ]
}

実行結果を見ると、「StudentMarks」フィールドの値が 59 から 60 に更新されています。つまり、指定した通り 1 だけインクリメントされたことが確認できます。

補足:モダンなMongoDBでの書き方

MongoDB 4.2 以降では、旧式の update() メソッドの代わりに、updateOne()updateMany() の使用が推奨されています。上記の更新処理は、次のように書き換えることができます。

> db.incrementValueInNestedArrayDemo.updateOne(
   { UniqueId:1, "StudentDetails.StudentId":107 },
   { $inc:{ "StudentDetails.$.StudentMarks":1 } }
);

このように、位置演算子「$」を活用すれば、ネストされた配列内の特定の要素だけを効率的に更新できます。配列操作はMongoDBの重要な機能の一つなので、ぜひマスターしておきましょう。

  1. MongoDBでネストされた配列をソートする方法:$unwindと$sortを活用したクエリ

    MongoDBでドキュメント内に格納されたネストされた配列(サブドキュメントの配列)をソートしたい場合、集計パイプライン(aggregate)を使い、$unwindで配列を展開した後に$sortで並べ替え、最後に$groupで再構成するのが定番のアプローチです。この記事では、実際にコレクションを作成しながら、ネストされた配列をスコア順にソートする手順を解説します。1. サンプルコレクションの作成まず、ネストされた配列「details」を持つドキュメントを挿入してコレクションを作成します。> db.demo505.insertOne( ... { ... details: [ ..

  2. MongoDBで配列の値を使ってコレクションを並べ替える方法

    MongoDBのコレクションを配列の値を基準にソートしたい場合は、aggregate()メソッドと $sort ステージを組み合わせて使用します。さらに、配列を個々のドキュメントに分解するために $unwind も活用します。 サンプルコレクションの作成 まず、ドキュメントを含むコレクションを作成しましょう。ここでは、学生ごとの詳細情報(名前とスコア)を配列として持つドキュメントを挿入します。 > db.demo577.insertOne( ... { ... student: { ... details: [ ... { .