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

MongoDBでネストされたオブジェクト(配列要素)の値をインクリメントする方法|$inc演算子と位置演算子$の使い方

MongoDBでは、ネストされたオブジェクトや配列内のフィールドの値を増減させたい場合、$inc演算子を使用します。配列内の特定の要素を更新する際には、位置演算子「$」と組み合わせることで、条件に一致した要素だけを効率的に更新できます。

この記事では、実際のコード例を使いながら、ネストされた配列内の数値をインクリメントする手順をわかりやすく解説します。

1. コレクションの作成とドキュメントの挿入

まず、insertOne()メソッドを使ってサンプルデータを挿入します。ここでは、生徒名・国名・科目ごとの点数を持つドキュメントを作成します。

> db.incrementValueDemo.insertOne({
   "StudentName": "Larry",
   "StudentCountryName": "US",
   "StudentDetails": [
     {
       "StudentSubjectName": "Math",
       "StudentMathMarks": 79
     }
   ]
});

実行すると、以下のように挿入が成功したことが確認できます。

{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c986ca0330fd0aa0d2fe4a2")
}

2. 挿入したドキュメントの確認

find()メソッドにpretty()を組み合わせると、コレクション内の全ドキュメントを見やすい形式で表示できます。

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

出力結果は以下の通りです。

{
   "_id" : ObjectId("5c986ca0330fd0aa0d2fe4a2"),
   "StudentName" : "Larry",
   "StudentCountryName" : "US",
   "StudentDetails" : [
     {
       "StudentSubjectName" : "Math",
       "StudentMathMarks" : 79
     }
   ]
}

現在、「Math」の点数は79点です。この値をインクリメントしていきます。

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

ここが本題です。配列「StudentDetails」の中にある「StudentMathMarks」を更新するには、クエリ条件で一致させた要素を指す位置演算子「$」を使用します。

> db.incrementValueDemo.update(
   { "StudentDetails.StudentSubjectName": "Math" },
   { $inc: { "StudentDetails.$.StudentMathMarks": 1 } }
);

実行結果は以下のようになります。

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  • nMatched: 1 … 条件に一致したドキュメントが1件あることを示します
  • nModified: 1 … 実際に更新されたドキュメントが1件であることを示します

ポイントは「StudentDetails.$.StudentMathMarks」という指定部分です。「$」が、クエリ条件(StudentSubjectNameが「Math」)に一致した配列要素の位置を自動的に表すため、意図した要素だけが更新されます。

4. 更新結果の確認

再度find()を実行して、値が正しくインクリメントされたか確認しましょう。

> db.incrementValueDemo.find().pretty();
{
   "_id" : ObjectId("5c986ca0330fd0aa0d2fe4a2"),
   "StudentName" : "Larry",
   "StudentCountryName" : "US",
   "StudentDetails" : [
     {
       "StudentSubjectName" : "Math",
       "StudentMathMarks" : 80
     }
   ]
}

「StudentMathMarks」が79から80に増加していることが確認できました。

補足:最新のMongoDBではupdateOne()の使用を推奨

上記の例で使用しているupdate()メソッドは非推奨(deprecated)となっており、現在のMongoDBでは用途に応じて以下のメソッドを使うのが標準的です。

  • updateOne() … 条件に一致した最初の1件のみ更新
  • updateMany() … 条件に一致したすべてのドキュメントを更新

同じ処理をupdateOne()で書くと、次のようになります。

> db.incrementValueDemo.updateOne(
   { "StudentDetails.StudentSubjectName": "Math" },
   { $inc: { "StudentDetails.$.StudentMathMarks": 1 } }
);

まとめ

  • 値の増減には$inc演算子を使用する(負の値を指定すればデクリメントも可能)
  • 配列内の特定要素を更新するには位置演算子「$」を組み合わせる
  • 新しいコードではupdateOne() / updateMany()を使うのが推奨される

$incと位置演算子を理解しておくと、カウンター管理やスコア更新など、ネストされたデータ構造を持つドキュメントの操作が格段に楽になります。ぜひ実際のプロジェクトでも活用してみてください。

  1. MongoDBで配列オブジェクト内の配列要素の値をインクリメントする方法

    MongoDBでは、配列オブジェクト内の特定の要素の値を増加させたい場合、$inc 演算子を使用します。本記事では、実際にコレクションを作成し、配列内の「Quantity」フィールドの値をインクリメントする手順を順番に解説します。 1. サンプルコレクションの作成 まず、ドキュメントを含むコレクションを作成します。以下の例では、「details」という配列フィールドの中に、複数のオブジェクト(id と Quantity を持つ)が格納されたドキュメントを挿入しています。 > db.demo506.insertOne({details:[{id:1,Quantity:4},{id:2,Qu

  2. MongoDBでドキュメントの値を1つだけインクリメントする方法

    MongoDBでドキュメント内の特定の値だけを更新し、インクリメント(加算)したい場合は、update()メソッドと$inc演算子を組み合わせて使用します。$incは指定したフィールドの数値を増減させるための演算子で、他のフィールドに影響を与えることなくピンポイントで値を変更できるのが特徴です。サンプルコレクションの作成まず、ドキュメントを格納したコレクションを作成します。> db.demo698.insertOne({Score:78});{   "acknowledged" : true,   "insertedI