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

MongoDBでドキュメント内の配列要素を1ずつインクリメントして更新する方法

MongoDBでは、ドキュメント内の配列(リスト)の中から特定の要素だけを取り出して更新し、その値を1ずつ増加させたいケースがあります。このような場合には、位置演算子($)$inc演算子を組み合わせて使用します。

  • 位置演算子($):クエリ条件に一致した配列要素を自動的に特定するための演算子です。
  • $inc演算子:フィールドの数値を指定した量だけ増減させるための演算子です。

それでは、実際にサンプルコレクションを作成しながら、具体的な手順を見ていきましょう。

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

まず、insertOne()メソッドを使って「demo39」というコレクションにドキュメントを挿入します。

>db.demo39.insertOne({"ProductDetails":[{"ProductName":"Product-1","ProductPrice":349}]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e176d54cfb11e5c34d898df")
}
>db.demo39.insertOne({"ProductDetails":[{"ProductName":"Product-2","ProductPrice":998}]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e176d61cfb11e5c34d898e0")
}
>db.demo39.insertOne({"ProductDetails":[{"ProductName":"Product-3","ProductPrice":145}]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e176d6acfb11e5c34d898e1")
}

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

find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。

> db.demo39.find();

これにより、次のような出力が得られます。

{ "_id" : ObjectId("5e176d54cfb11e5c34d898df"), "ProductDetails" : [ { "ProductName" : "Product-1", "ProductPrice" : 349 } ] }
{ "_id" : ObjectId("5e176d61cfb11e5c34d898e0"), "ProductDetails" : [ { "ProductName" : "Product-2", "ProductPrice" : 998 } ] }
{ "_id" : ObjectId("5e176d6acfb11e5c34d898e1"), "ProductDetails" : [ { "ProductName" : "Product-3", "ProductPrice" : 145 } ] }

3. 配列要素を1インクリメントする更新クエリ

以下は、MongoDBドキュメント内の単一の配列要素を更新するためのクエリです。ここでは、「Product-2」のProductPriceを1増やしています。

> db.demo39.update({"_id" : ObjectId("5e176d61cfb11e5c34d898e0"),'ProductDetails.ProductName':"Product-2"},{$inc: {'ProductDetails.$.ProductPrice': 1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

このクエリでは、_idと「ProductDetails.ProductName」が「Product-2」であることを条件にドキュメントを絞り込み、「ProductDetails.$.ProductPrice」に対して$incで1を加算しています。位置演算子「$」が機能することで、条件に一致した配列要素だけが更新対象になります。

4. 更新後のドキュメントの確認

もう一度find()メソッドを実行して、更新結果を確認してみましょう。

> db.demo39.find();

実行すると、次の出力が得られます。

{ "_id" : ObjectId("5e176d54cfb11e5c34d898df"), "ProductDetails" : [ { "ProductName" : "Product-1", "ProductPrice" : 349 } ] }
{ "_id" : ObjectId("5e176d61cfb11e5c34d898e0"), "ProductDetails" : [ { "ProductName" : "Product-2", "ProductPrice" : 999 } ] }
{ "_id" : ObjectId("5e176d6acfb11e5c34d898e1"), "ProductDetails" : [ { "ProductName" : "Product-3", "ProductPrice" : 145 } ] }

ご覧のとおり、「Product-2」のProductPriceだけが998から999へと1増加しており、他のドキュメントには一切影響していません。このように、位置演算子($)と$inc演算子を組み合わせれば、配列内の特定の要素だけを効率的かつ安全に更新できます。

  1. Pythonの例外処理入門:try・exceptの基本とよく使われる例外の種類

    Pythonで例外処理(エラーハンドリング)を行うには、まず「except」句を使って例外を捕捉する仕組みを理解する必要があります。Pythonでは、例外をキャッチするために「try」と「except」というキーワードが用意されています。tryブロック内のコードは文ごとに順番に実行されますが、途中で例外が発生すると、残りのtryブロックのコードは実行されず、代わりにexcept節が実行される仕組みです。基本的な構文try: some_statements_here except: exception_handlingシンプルな例まずは非常に簡単な例で構文を確認してみましょう。t

  2. Pythonでリストの要素値を更新する方法【サンプルコード付き解説】

    Pythonのリストはミュータブル(変更可能)Pythonのリストオブジェクトはミュータブル(mutable)、つまり作成後でも内容を変更できる性質を持っています。そのため、リストの要素は自由に更新・書き換えが可能です。インデックスを指定して値を更新するリストの要素を更新するには、インデックス(添字)を使って対象の要素にアクセスし、新しい値を代入します。例えば、5番目の要素(インデックスは0から数えるため「4」)を、元の値の2倍に更新したい場合は次のように記述します。>>> L1 [10, 50, 20, 9, 40, 100, 60, 30, 1, 56] >>