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

MongoDBの$unwind演算子とは?配列を展開する使い方を徹底解説

MongoDBの$unwind(アンワインド)演算子は、配列フィールドの各要素に対して1つのドキュメントを出力するための演算子です。配列に複数の要素が含まれている場合、その要素数だけドキュメントが複製され、それぞれのドキュメントには配列の要素が1つずつ割り当てられます。本記事では、実際のサンプルコードを使いながら、$unwind演算子の基本的な使い方をわかりやすく解説します。

サンプルデータの作成

まず、$unwind演算子の動作を確認するために、テスト用のコレクションを作成します。次のクエリを実行して、ドキュメントを挿入しましょう。

> db.unwindOperatorDemo.insertOne({"StudentName":"Larry","StudentAge":23,"StudentSubject":["C","C++","Java","MongoDB"]});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c7ef5f3559dd2396bcfbfc8")
}

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

find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。次のクエリを実行してください。

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

出力結果

{
    "_id" : ObjectId("5c7ef5f3559dd2396bcfbfc8"),
    "StudentName" : "Larry",
    "StudentAge" : 23,
    "StudentSubject" : [
        "C",
        "C++",
        "Java",
        "MongoDB"
    ]
}

「StudentSubject」フィールドには、C、C++、Java、MongoDBという4つの科目が配列として格納されていることが確認できます。

$unwind演算子の実行例

それでは、$unwind演算子のデモを実行してみましょう。aggregate()メソッドの中で、$projectステージと$unwindステージを組み合わせて使用します。

> db.unwindOperatorDemo.aggregate(
    { $project : {
        StudentName : 1 ,
        StudentAge: 1 ,
        StudentSubject : 1
    }},
    { $unwind : "$StudentSubject" }
).pretty();

出力結果

{
    "_id" : ObjectId("5c7ef5f3559dd2396bcfbfc8"),
    "StudentName" : "Larry",
    "StudentAge" : 23,
    "StudentSubject" : "C"
}
{
    "_id" : ObjectId("5c7ef5f3559dd2396bcfbfc8"),
    "StudentName" : "Larry",
    "StudentAge" : 23,
    "StudentSubject" : "C++"
}
{
    "_id" : ObjectId("5c7ef5f3559dd2396bcfbfc8"),
    "StudentName" : "Larry",
    "StudentAge" : 23,
    "StudentSubject" : "Java"
}
{
    "_id" : ObjectId("5c7ef5f3559dd2396bcfbfc8"),
    "StudentName" : "Larry",
    "StudentAge" : 23,
    "StudentSubject" : "MongoDB"
}

出力結果をご覧ください。「StudentName」フィールドと「StudentAge」フィールドが、「StudentSubject」配列の各要素(C、C++、Java、MongoDB)ごとに複製され、それぞれ個別のドキュメントとして出力されていることがわかります。

このように$unwind演算子を使うことで、配列の要素を独立したドキュメントとして扱えるようになり、その後の集計($groupなど)やフィルタリング($matchなど)の処理が格段に行いやすくなります。配列データを分析したい場合に非常に便利な演算子なので、ぜひ活用してみてください。

  1. Pythonのべき乗演算子(**)は右結合!結合法則と評価順序をわかりやすく解説

    Pythonの**演算子の結合法則とは? Python公式ドキュメントによると、同じ優先順位グループに属する演算子は、比較演算子を除いて左から右へ結合されます。ただし、べき乗演算子(**)だけは例外的に右から左へ結合されるという特別なルールがあります。 つまり、** 演算子は「右結合(right-associative)」です。これは数学における指数の性質と一致しており、直感的にも理解しやすい仕様になっています。 具体的な評価のされ方 たとえば、次のような式があった場合: 2 ** 3 ** 4 この式は、左から計算されるのではなく、次のように右側から評価されます。 2 ** (3 ** 4

  2. Pythonの&=演算子とは?ビット演算とインプレース代入の仕組みを解説

    &=演算子の正体:object.__iand__()メソッドPythonにおける &= 演算子は、object.__iand__() メソッドに対するシンタックスシュガー(糖衣構文)です。公式ドキュメントには以下のように記載されています。「これらのメソッドは、拡張代入演算子(+=、-=、*=、@=、/=、//=、%=、**=、<<=、>>=、&=、^=、|=)を実装するために呼び出されます。これらのメソッドは、可能な限りインプレース(self自身を直接変更する形)で操作を行い、その結果を返すことが求められます(返り値はselfである必要はありませ