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

MongoDBの$addToSetで深くネストされたオブジェクト配列に値を追加する方法

$addToSet演算子とは

MongoDBの$addToSet演算子は、配列に値を追加するための更新演算子です。ただし、追加しようとする値がすでに配列内に存在する場合、$addToSetはその配列に対して何も行いません。この重複チェック機能により、配列内の要素の一意性を保ったまま値を追加できるのが特徴です。

本記事では、$addToSetを使って、ドキュメント内の深くネストされたオブジェクト配列に値を追加する具体的な手順をサンプルコード付きで解説します。

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

まず、ネストされた構造を持つドキュメントを含むコレクションを作成しましょう。次のクエリを実行します。

> db.demo380.insertOne({
...
   "details" : [
      {
         "Name" : "Chris",
         "details1" : [ ]
      },
      {
         "Name" : "David",
         "details1" : [ ]
      }
   ]
}
);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e5b56e32ae06a1609a00b11")
}

登録済みドキュメントの確認

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

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

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

{
   "_id" : ObjectId("5e5b56e32ae06a1609a00b11"),
   "details" : [
      {
         "Name" : "Chris",
         "details1" : [ ]
      },
      {
         "Name" : "David",
         "details1" : [ ]
      }
   ]
}

$addToSetでネストされた配列にオブジェクトを追加する

続いて、位置指定演算子「$」と$addToSetを組み合わせて、details配列内の特定の要素(Nameが"David"の要素)が持つdetails1配列に、新しいオブジェクトを追加します。

> db.demo380.update({
...    "details.Name": "David"
...    }, {
...    $addToSet: {
...       "details.$.details1": {
...          'SubjectName': "MongoDB",
...          'TeacherName':"Bob"
...       }
...    }
... }, false, true);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

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

更新後のドキュメントを確認する

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

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

実行結果は次の通りです。

{
   "_id" : ObjectId("5e5b56e32ae06a1609a00b11"),
   "details" : [
      {
         "Name" : "Chris",
         "details1" : [ ]
      },
      {
         "Name" : "David",
         "details1" : [
            {
               "SubjectName" : "MongoDB",
               "TeacherName" : "Bob"
            }
         ]
      }
   ]
}

このように、条件に一致した"David"のdetails1配列にだけ新しいオブジェクトが追加され、"Chris"のdetails1配列は空のまま影響を受けていないことが確認できます。

まとめ

$addToSet演算子は、位置指定演算子「$」と組み合わせることで、ネストされた配列に対しても重複なく値を追加できます。クエリ条件(この例では details.Name: "David")に一致した最初の要素を「$」が参照する仕組みを理解しておけば、複雑なドキュメント構造の更新もスムーズに行えます。なお、新しいバージョンのMongoDBではupdateOne()やupdateMany()の使用が推奨されているため、実運用では適宜置き換えを行いましょう。

  1. MongoDBでネストされた配列を集約する方法:$addFieldsと$mapの活用

    MongoDBでネストされた配列を集約するには、aggregate()メソッドを使用します。この記事では、$addFieldsや$mapといった集約パイプラインの演算子を組み合わせて、入れ子構造の配列から特定の条件に合致する要素を抽出する方法を、実際のコード例とともに解説します。サンプルコレクションの作成まず、ネストされた配列を持つドキュメントを含むコレクションを作成しましょう。insertOne()メソッドを使って、ドキュメントを挿入します。> db.demo441.insertOne( ... { ... Name : David, ... Age :

  2. MongoDBでネストされた配列をソートする方法:$unwindと$sortを活用したクエリ

    MongoDBでドキュメント内に格納されたネストされた配列(サブドキュメントの配列)をソートしたい場合、集計パイプライン(aggregate)を使い、$unwindで配列を展開した後に$sortで並べ替え、最後に$groupで再構成するのが定番のアプローチです。この記事では、実際にコレクションを作成しながら、ネストされた配列をスコア順にソートする手順を解説します。1. サンプルコレクションの作成まず、ネストされた配列「details」を持つドキュメントを挿入してコレクションを作成します。> db.demo505.insertOne( ... { ... details: [ ..