MongoDBのAggregateで配列の最初の要素を取得して返す方法
MongoDBのAggregateで配列の最初の要素を取得する方法
MongoDBで配列フィールドから最初の要素だけを取り出したい場合、$unwind演算子と$projectステージを組み合わせたアグリゲーションパイプラインが有効です。この記事では、実際のコード例を通じて、具体的な手順をわかりやすく解説します。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。以下のクエリを実行します。
>db.getFirstElementInArrayDemo.insertOne({"StudentName":"John","StudentSubject":["MongoDB","Python","MySQL"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9c41292d6669774125244e")
}
>db.getFirstElementInArrayDemo.insertOne({"StudentName":"Chris","StudentSubject":["Java","C"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9c413f2d6669774125244f")
}
>db.getFirstElementInArrayDemo.insertOne({"StudentName":"Robert","StudentSubject":["C++","Ruby"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9c41532d66697741252450")
}
ここでは、学生名(StudentName)と履修科目の配列(StudentSubject)を持つ3件のドキュメントを挿入しました。
2. 登録したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみます。
> db.getFirstElementInArrayDemo.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5c9c41292d6669774125244e"),
"StudentName" : "John",
"StudentSubject" : [
"MongoDB",
"Python",
"MySQL"
]
}
{
"_id" : ObjectId("5c9c413f2d6669774125244f"),
"StudentName" : "Chris",
"StudentSubject" : [
"Java",
"C"
]
}
{
"_id" : ObjectId("5c9c41532d66697741252450"),
"StudentName" : "Robert",
"StudentSubject" : [
"C++",
"Ruby"
]
}
3. Aggregateで配列の最初の要素を取得する
それでは本題です。aggregate()を使って、各ドキュメントの配列から最初の要素を取得し、返すクエリは以下の通りです。
> db.getFirstElementInArrayDemo.aggregate([
... {$unwind:"$StudentSubject"},
... {$group:{"_id":"$_id","FirstElement":{$first:"$StudentSubject"}}},
... {$project:{"_id":0,"FirstElement":1}}
... ]);
このパイプラインは、以下の3つのステージで構成されています。
- $unwind:配列フィールドを分解し、要素ごとに個別のドキュメントを生成します。
- $group + $first:元のドキュメントIDごとにグループ化し、$first演算子で各グループの最初の値を取得します。
- $project:出力から_idを除外し、FirstElementフィールドのみを表示するように整形します。
実行すると、次の出力が得られます。
{ "FirstElement" : "Java" }
{ "FirstElement" : "C++" }
{ "FirstElement" : "MongoDB" }
各学生の履修科目リストの先頭要素だけが抽出されていることが確認できます。
4. 代替方法:$slice演算子を使う
アグリゲーションを使わずに、find()メソッドで$slice演算子を指定する方法もあります。こちらの方がよりシンプルです。
> db.getFirstElementInArrayDemo.find({},{"StudentSubject":{$slice:1}});
実行結果は以下の通りです。
{ "_id" : ObjectId("5c9c41292d6669774125244e"), "StudentName" : "John", "StudentSubject" : [ "MongoDB" ] }
{ "_id" : ObjectId("5c9c413f2d6669774125244f"), "StudentName" : "Chris", "StudentSubject" : [ "Java" ] }
{ "_id" : ObjectId("5c9c41532d66697741252450"), "StudentName" : "Robert", "StudentSubject" : [ "C++" ] }
$sliceに1を指定することで、配列の先頭から1つ目の要素だけが返されます。なお、この方法では要素が単一の値ではなく配列形式で返される点に注意してください。
まとめ
MongoDBで配列の最初の要素を取得するには、大きく分けて2つの方法があります。
- aggregate()を使う方法:$unwind → $group($first) → $project のパイプラインで、単一の値として取得できます。
- find() + $sliceを使う方法:記述がシンプルで手軽ですが、結果は配列形式になります。
用途に応じて使い分けることで、効率的にデータを取得できます。
-
MongoDBのAggregateでドキュメントと配列要素の平均値を取得する方法
MongoDBでドキュメントのフィールドおよび配列内の各要素の平均値を求めるには、aggregate()メソッドと$groupステージを組み合わせ、平均を計算する$avg演算子を使用します。ここでは、実際にサンプルコレクションを作成しながら、具体的な手順を解説します。 サンプルコレクションの作成 まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成します。 > db.demo598.insertOne( ... { ... Information:Student, ... &
-
PHPで配列の最初の要素を取得する方法をわかりやすく解説
PHPで配列の最初の要素を取得する方法はいくつかあります。ここでは、代表的な手法をサンプルコードとともに紹介します。例1:キーを直接指定して取得する連想配列の場合、先頭のキーがわかっていれば、そのキーを指定するだけで最初の要素にアクセスできます。<?php $arr = array( p=>150, q=>100, r=>120, s=>110, t=>115, u=>103, v=>105, w=>125 ); echo 配列の値 ...\n;