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

MongoDBで配列要素を更新する方法|$addToSet演算子の使い方を解説

MongoDBの配列要素を更新するには?

MongoDBでドキュメント内の配列要素を更新したい場合、$addToSet 演算子を使用します。この演算子は、指定した値が配列に存在しない場合のみ追加するため、重複データの発生を防ぎながら安全に配列へ要素を追加できるのが特徴です。

本記事では、実際にコレクションを作成し、$addToSet演算子を使ってネストされた配列要素を更新する手順を、具体的なコード例とともに解説します。

1. テスト用コレクションとドキュメントの作成

まず、insertOne() メソッドを使ってサンプル用のコレクションとドキュメントを作成します。

> db.updateArrayDemo.insertOne(
...    {
...       "ClientDetails" : [
...          {
...             "ClientName" : "John",
...             "DeveloperDetails" : [ ]
...          },
...          {
...             "ClientName" : "Larry",
...             "DeveloperDetails" : [ ]
...          }
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ccf465edceb9a92e6aa1960")
}

この例では、「ClientDetails」という配列の中に、クライアントごとの情報(ClientName と空の DeveloperDetails 配列)を持つドキュメントを挿入しています。

2. find() メソッドですべてのドキュメントを表示

次に、find() メソッドを使ってコレクション内のすべてのドキュメントを確認してみましょう。

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

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

{
   "_id" : ObjectId("5ccf465edceb9a92e6aa1960"),
   "ClientDetails" : [
      {
         "ClientName" : "John",
         "DeveloperDetails" : [ ]
      },
      {
         "ClientName" : "Larry",
         "DeveloperDetails" : [ ]
      }
   ]
}

3. $addToSet演算子で配列要素を更新する

ここからが本題です。以下のクエリでは、位置演算子「$」を組み合わせて、条件に一致した配列要素(この場合は ClientName が "Larry" の要素)に対して新しいフィールド「Technology」を追加しています。

> db.updateArrayDemo.update({ "ClientDetails.ClientName": "Larry" },
{ $addToSet: { "ClientDetails.$.Technology": { 'DeveloperName': "Chris", 'WorkExperience':5 } } }, false, true);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

クエリのポイントは以下の通りです。

・位置演算子「$」: 検索条件に一致した配列要素を自動的に特定し、その要素だけを更新対象にします。
・第3引数(false): upsert を無効にしています。一致するドキュメントがない場合でも新規作成されません。
・第4引数(true): multi オプションを有効にし、条件に一致するすべてのドキュメントを更新対象にします。

実行結果の WriteResult では「nMatched: 1」「nModified: 1」と表示されており、1件のドキュメントが正常に更新されたことがわかります。

4. 更新結果の確認

最後に、再度 find() メソッドを実行して、配列要素が正しく更新されているかどうかを確認しましょう。

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

実行すると、以下のように Larry のドキュメントに Technology フィールドが追加されていることが確認できます。

{
   "_id" : ObjectId("5ccf465edceb9a92e6aa1960"),
   "ClientDetails" : [
      {
         "ClientName" : "John",
         "DeveloperDetails" : [ ]
      },
      {
         "ClientName" : "Larry",
         "DeveloperDetails" : [ ],
         "Technology" : [
            {
               "DeveloperName" : "Chris",
               "WorkExperience" : 5
            }
         ]
      }
   ]
}

まとめ

MongoDBで配列要素を更新する際には、$addToSet 演算子と位置演算子「$」を組み合わせることで、ネストされた配列の特定の要素に対して効率的にフィールドを追加できます。$addToSet は既存の値との重複を自動的に回避してくれるため、意図しない重複データを防ぎたいケースで特に便利です。なお、最新のMongoDBバージョンでは update() メソッドの代わりに updateOne()updateMany() の使用が推奨されていますので、新規開発の際にはこれらのメソッドを利用するとよいでしょう。

  1. MongoDBで配列の要素を削除するには?$pull演算子の使い方を解説

    MongoDBで配列から要素を削除する基本MongoDBで配列内の要素を削除したい場合は、$pull演算子を使用します。$pullは、既存の配列から指定した値、または条件に一致するすべてのインスタンスを取り除くための更新演算子です。この記事では、実際にコレクションを作成し、ネストされた配列から特定の要素を削除する手順を順番に解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。ここでは「software」フィールドの中に「services」という配列を持つドキュメントを挿入します。db.demo541.insertOne({software:{servic

  2. MongoDBでJSON配列の内部要素にアクセスする方法|ドット記法の使い方を解説

    MongoDBでJSON配列の内部要素にアクセスするには、ドット記法(dot notation)を使用します。本記事では、実際にコレクションを作成し、ネストされた配列内のフィールドを検索する具体的な手順を、サンプルコードと実行結果とともに解説します。 サンプルデータの作成 まず、insert()メソッドを使って、ネストされた構造を持つドキュメントを含むコレクションを作成しましょう。 > db.demo687.insert({CountryName:US, ... info: ... { ... id:101, ... details: ... [ ... { ...   &n