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

MongoDBでドキュメント内の配列オブジェクトを更新する構文とは?

配列内のオブジェクトを更新する基本手法

ドキュメント内の配列に格納されたオブジェクトを更新するには、MongoDBのfindOneAndUpdate()メソッドを使用します。このメソッドは、指定したフィルター条件とソート条件に基づいて、単一のドキュメントを検索して更新できる便利なメソッドです。位置演算子「$」と組み合わせることで、配列内の特定の要素だけをピンポイントで変更できます。

1. サンプルコレクションの作成

まず、insertOne()メソッドを使って、試験情報を持つサンプルコレクションを作成しましょう。

> db.demo553.insertOne(
... {
...    id:101,
...    "Name":"John",
...    midExamDetails:
...    [
...       {"SubjectName":"MySQL","Marks":70},
...       {"SubjectName":"MongoDB","Marks":35}
...    ]
... }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8e3da19e5f92834d7f05ed")
}

2. 登録されたドキュメントの確認

find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみます。

> db.demo553.find();

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

{ "_id" : ObjectId("5e8e3da19e5f92834d7f05ed"), "id" : 101, "Name" : "John", "midExamDetails" : [
   { "SubjectName" : "MySQL", "Marks" : 70 },
   { "SubjectName" : "MongoDB", "Marks" : 35 } 
] }

3. 配列内のオブジェクトを更新するクエリ

ここからが本題です。以下のクエリでは、フィルター条件で「id:101」かつ「midExamDetails.SubjectNameがMongoDB」という要素を特定し、$set演算子と位置演算子「$」を使って該当する配列要素のMarks値を97に更新しています。

> db.demo553.findOneAndUpdate(
...    { id:101,
...        "midExamDetails.SubjectName":"MongoDB"
...    },
...    { $set:{
...       'midExamDetails.$.Marks': 97
...    }
... }
... );
{
   "_id" : ObjectId("5e8e3da19e5f92834d7f05ed"),
   "id" : 101,
   "Name" : "John",
   "midExamDetails" : [
      {
         "SubjectName" : "MySQL",
         "Marks" : 70
      },
      {
         "SubjectName" : "MongoDB",
         "Marks" : 35
      }
   ]
}

ポイントは、「midExamDetails.$.Marks」という記述です。位置演算子「$」は、フィルター条件にマッチした最初の配列要素を自動的に参照するため、インデックス番号を意識せずに目的の要素を更新できます。

4. 更新結果の確認

再度find()メソッド(.pretty()で整形表示)を実行して、更新結果を確認しましょう。

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

実行すると、次のようにMongoDBの点数が35から97へ正しく更新されていることが分かります。

{
   "_id" : ObjectId("5e8e3da19e5f92834d7f05ed"),
   "id" : 101,
   "Name" : "John",
   "midExamDetails" : [
      {
         "SubjectName" : "MySQL",
         "Marks" : 70
      },
      {
         "SubjectName" : "MongoDB",
         "Marks" : 97
      }
   ]
}

まとめ

配列内のオブジェクトを更新する際は、findOneAndUpdate()(またはupdateOne())に対して、①配列内の対象要素を特定するフィルター条件と、②位置演算子「$」を使った$setによる更新値の指定、という2つの組み合わせが基本となります。このパターンを覚えておけば、ネストされたデータ構造を持つドキュメントでも柔軟に部分更新が行えます。

  1. MongoDBで_idを指定してコレクション内のドキュメントを更新する方法

    MongoDBでは、_idを指定して特定のドキュメントを更新する際に、$set演算子を使用します。_idは各ドキュメントの一意な識別子であるため、これを条件にすることで目的のドキュメントだけを正確に更新できます。この記事では、実際にコレクションを作成し、_idをキーにしてドキュメントを更新する手順を順番に解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne()メソッドを使ってサンプルのコレクションにドキュメントを挿入します。db.demo741.insertOne({SubjectName:MySQL}); { acknowledged : true,

  2. MongoDBで配列内の重複要素を検出・確認する方法

    MongoDBで配列内の重複要素を検出・確認する方法配列フィールドの中に重複した要素が存在するかどうかを確認したい場合、MongoDBではaggregate()メソッドを使用します。本記事では、実際のサンプルコードを通じて、集計パイプライン(アグリゲーションフレームワーク)を使った重複検出の手順をわかりやすく解説します。1. サンプルコレクションの作成まず、テスト用のドキュメントを挿入してコレクションを作成しましょう。意図的に重複を含む配列を持つドキュメントも用意します。> db.demo756.insertOne({SubjectName:[MySQL,MongoDB,Java]});