MongoDBで多次元配列をプロジェクションする方法|aggregateの使い方を解説
MongoDBで多次元配列に対してプロジェクション(特定の要素だけを取り出す操作)を行いたい場合、通常のfind()メソッドでは対応できず、アグリゲーションフレームワークを使用する必要があります。
この記事では、実際にコレクションを作成しながら、多次元配列から目的の値を取り出す手順を具体的に見ていきましょう。
1. サンプルデータの作成
まず、ドキュメントを含むコレクションを作成します。ここでは、学生の点数を多次元配列として格納した例を使用します。
> db.multiDimensionalArrayProjection.insertOne(
... {
... "StudentFirstName" : "Chris",
... "StudentMarks" : [ [98, 99],[56,79] ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc6b75a9cb58ca2b005e66c")
}この例では、StudentMarksフィールドに「[[98, 99], [56, 79]]」という二次元配列が格納されています。
2. 登録したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.multiDimensionalArrayProjection.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5cc6b75a9cb58ca2b005e66c"),
"StudentFirstName" : "Chris",
"StudentMarks" : [
[
98,
99
],
[
56,
79
]
]
}3. アグリゲーションによる多次元配列のプロジェクション
それが本題です。多次元配列から特定の要素を取り出すには、$unwindや$projectなどのステージを組み合わせたパイプラインを構築します。
> db.multiDimensionalArrayProjection.aggregate([
... { $unwind: '$StudentMarks' },
... { $limit: 1 },
... { $project: { _id: 0, StudentMarks: 1 } },
... { $unwind: '$StudentMarks' },
... { $skip: 1 },
... { $limit: 1 }
... ]);実行結果は以下の通りです。
{ "StudentMarks" : 99 }各ステージの処理内容
上記のパイプラインがどのように動作しているのか、順番に解説します。
- $unwind:配列を分解し、各要素ごとに個別のドキュメントを生成します。最初の
$unwindで外側の配列が展開され、[98, 99]と[56, 79]の2つのドキュメントになります。 - $limit:処理対象のドキュメント数を制限します。ここでは先頭の1件のみを扱います。
- $project:出力に含めるフィールドを指定します。
_id: 0でIDを除外し、StudentMarksのみを出力しています。 - 2つ目の$unwind:残った内側の配列
[98, 99]をさらに分解します。 - $skip / $limit:展開された要素の中から、指定位置の値だけを取得します。
このように、$unwindで多次元配列を段階的に展開しながら、$skipと$limitで位置を指定することで、ネストされた配列の任意の要素を取り出すことが可能です。
-
C言語における多次元配列の初期化方法を徹底解説
配列とは、同じ型の要素が連続したメモリ領域に順番に格納されたデータの集合です。先頭の要素には最も小さいアドレスが割り当てられ、末尾の要素には最も大きいアドレスが割り当てられます。配列のインデックスは 0 から始まり、配列サイズ - 1 で終わる点に注意しましょう。また、配列のサイズは必ず 0 より大きい整数である必要があります。配列のインデックスとサイズの関係具体的な例で確認してみましょう。配列サイズ = 10 の場合 最初のインデックス = 0 最後のインデックス = 配列サイズ - 1 = 10 - 1 = 9多次元配列とは多次元配列とは、いわば「配列の配列」のことです。データは表形式(行
-
C言語の多次元配列とは?行優先・列優先の仕組みとサンプルコード
多次元配列とは配列とは、同種のデータ(ホモジニアスなデータ)をまとめて管理するための基本的なデータ構造です。配列の要素は、メモリ上の連続した領域に順番に配置されます。しかし実際のプログラミングでは、1次元の配列だけでは不十分なケースが少なくありません。例えば、表形式のデータや行列を扱う場合には、2次元配列やさらに多くの次元を持つ多次元配列を作成する必要があります。行優先方式と列優先方式多次元配列をメモリ上に表現する方法には、大きく分けて2つのアプローチがあります。ひとつは行優先(Row-Major)方式、もうひとつは列優先(Column-Major)方式です。r行 c列の2次元配列を考えてみま