MongoDBの集計(aggregate)で複数ドキュメントを1つの配列にまとめる方法
MongoDBでは、aggregate()メソッドを使用することで、複数のドキュメントをグループ化し、1つのドキュメント内の配列としてまとめることができます。この記事では、$groupステージと$push演算子を組み合わせた実践的な方法を、サンプルコードとともに解説します。
準備:サンプルコレクションの作成
まずは動作確認用のコレクションを作成し、ドキュメントを挿入します。ここではinsertOne()を使って3件のデータを登録します。
> db.demo248.insertOne({"id":101,"Name":"Chris","Age":21,"CountryName":"US"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e46b6651627c0c63e7dba6d")
}
> db.demo248.insertOne({"id":101,"Name":"Bob","Age":22,"CountryName":"UK"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e46b6741627c0c63e7dba6e")
}
> db.demo248.insertOne({"id":102,"Name":"Mike","Age":20,"CountryName":"AUS"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e46b6811627c0c63e7dba6f")
}挿入したドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo248.find();
実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5e46b6651627c0c63e7dba6d"), "id" : 101, "Name" : "Chris", "Age" : 21, "CountryName" : "US" }
{ "_id" : ObjectId("5e46b6741627c0c63e7dba6e"), "id" : 101, "Name" : "Bob", "Age" : 22, "CountryName" : "UK" }
{ "_id" : ObjectId("5e46b6811627c0c63e7dba6f"), "id" : 102, "Name" : "Mike", "Age" : 20, "CountryName" : "AUS" }$groupと$pushで複数ドキュメントを配列に変換する
それが本題です。idフィールドの値ごとにドキュメントをグループ化し、同じidを持つ複数のドキュメントを1つの配列にまとめます。ポイントは、$groupステージ内で$push演算子を使うことです。
> db.demo248.aggregate([
... {
... $group : {
... _id : "$id",
... details : {
... $push : {
... id:"$id",
... Name:"$Name",
... Age:"$Age",
... CountryName:"$CountryName"
... }
... }
... }
... }
...])実行結果
{ "_id" : 102, "details" : [ { "id" : 102, "Name" : "Mike", "Age" : 20, "CountryName" : "AUS" } ] }
{ "_id" : 101, "details" : [ { "id" : 101, "Name" : "Chris", "Age" : 21, "CountryName" : "US" }, { "id" : 101, "Name" : "Bob", "Age" : 22, "CountryName" : "UK" } ] }処理のポイント解説
- _id : "$id" — グループ化のキーを指定します。ここでは
idフィールドの値が同じドキュメント同士が1つのグループになります。 - $push — グループ内の各ドキュメントから指定したフィールドを抜き出し、結果を配列に追加していきます。
- details —
$pushの結果が格納される新しいフィールド名です。任意の名前を付けられます。
この例では、idが「101」のChrisとBobの2件が1つのdetails配列にまとめられているのが分かります。このように$group+$pushを組み合わせることで、関連する複数のドキュメントを親子構造のように整形でき、アプリケーション側でのデータの扱いが格段にシンプルになります。
-
MongoDBのaggregate()で3階層にネストされた埋め込みドキュメントの配列をフィルタリングする方法
MongoDBでネストされた配列をフィルタリングする基本アプローチMongoDBで3階層にネストされた埋め込みドキュメントの配列をフィルタリングするには、aggregate()メソッドを使用します。集計パイプラインの中で$unwindによって配列を展開し、$matchで条件に一致するドキュメントを絞り込むのが基本的な流れです。この記事では、実際のコード例を通じて具体的な手順を解説します。1. サンプルコレクションの作成まずは動作確認用のコレクションを作成し、ドキュメントを挿入してみましょう。> db.demo736.insertOne( ... { ... _id:
-
MongoDBで配列を持つ1つのドキュメントを新しいコレクションの複数ドキュメントに変換する方法
MongoDBでは、配列フィールドを持つ1つのドキュメントを、配列の各要素に対応する複数のドキュメントとして新しいコレクションに変換できます。この処理には、集計パイプラインのaggregate()と$unwind、そして結果を別のコレクションに出力するための$outを組み合わせて使用します。サンプルコレクションの作成まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成しましょう。> db.demo757.insertOne( ... { ... id: 101, ... Name: [John, Bob, Chris]