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

MongoDBでJSONのリスト内のキー値を一括更新する方法を解説

MongoDBでJSONのリスト内のキー値を一括更新する方法を解説

MongoDBでは、1つのドキュメント内にネストされた配列(JSONのリスト)の各要素が持つキーの値を、まとめて更新したいケースがあります。本記事では、findOne()で対象ドキュメントを取得し、JavaScriptのforEach()で配列内の値を書き換えたうえで、update()$set演算子を使ってコレクションに反映させるという基本的なアプローチを、具体例とともに分かりやすく解説します。

ステップ1:ドキュメントを含むコレクションを作成する

まず、insertOne()メソッドを使ってサンプルデータを挿入し、テスト用のコレクションを作成します。ここでは、学生情報の配列「StudentDetails」を持つ1件のドキュメントを登録します。

> db.updateListOfKeyValuesDemo.insertOne( { "StudentDetails":[ { "StudentName":"John", "StudentAge":23, "StudentCountryName":"US" }, { "StudentName":"Carol", "StudentAge":24, "StudentCountryName":"UK" }, { "StudentName":"Bob", "StudentAge":22, "StudentCountryName":"AUS" } ] } );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9b5b759882024390176545")
}

挿入に成功すると、"acknowledged" : true と、新しく登録されたドキュメントのObjectIdが返されます。

ステップ2:find()メソッドで全ドキュメントを表示する

続いて、find()メソッドを使ってコレクション内のすべてのドキュメントを表示し、登録内容を確認します。

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

上記のクエリを実行すると、次のような出力が得られます。

{
   "_id" : ObjectId("5c9b5b759882024390176545"),
   "StudentDetails" : [
      {
         "StudentName" : "John",
         "StudentAge" : 23,
         "StudentCountryName" : "US"
      },
      {
         "StudentName" : "Carol",
         "StudentAge" : 24,
         "StudentCountryName" : "UK"
      },
      {
         "StudentName" : "Bob",
         "StudentAge" : 22,
         "StudentCountryName" : "AUS"
      }
   ]
}

3人の学生情報(John、Carol、Bob)が配列として格納されていることが確認できます。

ステップ3:配列内のキー値を更新するクエリを実行する

ここからが本題です。MongoDBでJSONのリスト内にあるキーの値を更新するには、次の3段階の手順を踏みます。

  1. ドキュメントの取得:findOne()で更新対象のドキュメントをシェル変数に読み込みます。
  2. 値の書き換え:forEach()でStudentDetails配列の各要素をループ処理し、StudentNameの値を「Ramit」に変更します。
  3. 変更の保存:update()$set演算子を使い、書き換え後の配列を元のドキュメントに反映します。
> var documentFromCollection = db.updateListOfKeyValuesDemo.findOne({
...    "_id": ObjectId("5c9b5b759882024390176545")
... });
>
> documentFromCollection.StudentDetails.forEach(function(updateStudent) {
...    updateStudent.StudentName = "Ramit";
... });
> db.updateListOfKeyValuesDemo.update(
...    { "_id": documentFromCollection._id },
...    { "$set": { "StudentDetails": documentFromCollection.StudentDetails } }
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

実行結果として返されるWriteResult({ "nMatched" : 1, ..., "nModified" : 1 })は、1件のドキュメントが検索条件にマッチし、正常に更新されたことを示しています。

ステップ4:更新結果を確認する

最後に、キー値のリストが実際に更新されたかどうかを、もう一度find()メソッドで確認してみましょう。

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

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

{
   "_id" : ObjectId("5c9b5b759882024390176545"),
   "StudentDetails" : [
      {
         "StudentName" : "Ramit",
         "StudentAge" : 23,
         "StudentCountryName" : "US"
      },
      {
         "StudentName" : "Ramit",
         "StudentAge" : 24,
         "StudentCountryName" : "UK"
      },
      {
         "StudentName" : "Ramit",
         "StudentAge" : 22,
         "StudentCountryName" : "AUS"
      }
   ]
}

出力を見ると、年齢や国名はそのままに、3人すべてのStudentNameが「Ramit」に更新されていることがわかります。

補足:より新しい書き方について

上記で使用したupdate()メソッドは旧来の形式であり、MongoDB 4.2以降では非推奨です。現在はupdateOne()updateMany()の使用が推奨されています。また、配列内の全要素を直接更新したい場合は、all positional operatorである$[]を活用すれば、シェル側でデータを取得・書き換えることなく、単一のupdate文だけで処理を完結させることも可能です。運用環境では、目的やバージョンに応じて最適な手法を選択してください。

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

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

  2. Pythonでタプルの要素値を更新する方法!list()とtuple()を使った手順を解説

    Pythonのタプルはイミュータブル(変更不可)なオブジェクトPythonのタプルはイミュータブル(不変)なオブジェクトです。そのため、タプルの要素を直接書き換えようとする操作は許可されておらず、エラーが発生します。ただし、いくつかの手順を踏むことで、実質的にタプルの要素値を更新することが可能です。ここでは最も一般的な回避策(ワークアラウンド)を紹介します。タプルをリストに変換してから更新する手順まず、組み込み関数 list() を使ってタプルをリストに変換します。リストはミュータブル(変更可能)なオブジェクトなので、特定のインデックスの要素に対して新しい値を代入することで、自由に内容を更新で