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

MongoDBのaggregate()を使って複数のドキュメントをマージ(統合)する方法

MongoDBで複数のドキュメントをマージするには?

MongoDBで複数のドキュメントを1つにマージ(統合)したい場合は、aggregate()メソッドを使用します。集計パイプラインの各ステージ($sort、$unwind、$group、$addFields、$projectなど)を組み合わせることで、特定のフィールドをキーにしてドキュメントをグループ化し、配列や数値をまとめることができます。

ここでは、実際にサンプルコレクションを作成しながら、具体的な手順を解説します。

1. コレクションの作成とドキュメントの挿入

まず、insertOne()メソッドを使ってサンプルコレクション「demo436」にドキュメントを挿入します。

> db.demo436.insertOne(
...     {
...        "_id" : "101",
...        "Name": "Chris",
...        "details" : [
...           {
...              "CountryName" : "US",
...              "Age" : 21
...           }
...        ],
...        "Price" : 50
...     }
... );
{ "acknowledged" : true, "insertedId" : "101" }

同様に、2件目と3件目のドキュメントも挿入します。

> db.demo436.insertOne(
...     {
...        "_id" : "102",
...        "Name": "Chris",
...        "details" : [
...           {
...              "CountryName" : "UK",
...              "Age" : 22
...           }
...        ],
...        "Price" : 78
...     }
... );
{ "acknowledged" : true, "insertedId" : "102" }
> db.demo436.insertOne(
...     {
...        "_id" : "103",
...        "Name": "Chris",
...        "details" : [
...           {
...              "CountryName" : "US",
...              "Age" : 21
...           }
...        ],
...        "Price" : 50
...     }
... );
{ "acknowledged" : true, "insertedId" : "103" }

この例では、「Name」フィールドがすべて「Chris」である3つのドキュメントを用意しました。これらを後ほど1つのドキュメントに統合します。

2. find()ですべてのドキュメントを確認

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

> db.demo436.find();

実行すると、次のような出力が得られます。

{ "_id" : "101", "Name" : "Chris", "details" : [ { "CountryName" : "US", "Age" : 21 } ], "Price" : 50 }
{ "_id" : "102", "Name" : "Chris", "details" : [ { "CountryName" : "UK", "Age" : 22 } ], "Price" : 78 }
{ "_id" : "103", "Name" : "Chris", "details" : [ { "CountryName" : "US", "Age" : 21 } ], "Price" : 50 }

3. aggregate()で複数のドキュメントをマージするクエリ

以下が、MongoDBで複数のドキュメントをマージするための集計クエリです。

> db.demo436.aggregate([
...     {$sort: {_id: 1, Name: 1}},
...     {$unwind: '$details'},
...     {$group: {_id: '$Name', details: {$push: '$details'},
...     Price: {$sum: '$Price'},
...     id: {$last: {$concat: ["$_id", "_", "AppendedValue" ]}},
...     Name: {$last: '$Name'}}},
...     {$addFields: {Id: 'NewIdAppped', _id: '$id'}},
...     {$project: {"id": 0 }}])

このクエリを実行すると、次のような結果が出力されます。

{ "_id" : "103_AppendedValue", "details" : [ { "CountryName" : "US", "Age" : 21 }, { "CountryName" : "UK", "Age" : 22 }, { "CountryName" : "US", "Age" : 21 } ], "Price" : 178, "Name" : "Chris", "Id" : "NewIdAppped" }

各パイプラインステージの解説

上記のクエリで使用している各ステージの役割は以下のとおりです。

  • $sort: ドキュメントを_idとNameの昇順に並べ替えます。これにより、マージ後の出力順序が安定します。
  • $unwind: 「details」配列を分解し、各要素を個別のドキュメントとして扱えるようにします。
  • $group: 「Name」フィールドをキーとしてドキュメントをグループ化します。$pushでdetails要素を1つの配列にまとめ、$sumでPriceの合計値(50 + 78 + 50 = 178)を算出しています。
  • $addFields: 新しいフィールド「Id」を追加し、_idを連結した文字列(例:"103_AppendedValue")で置き換えています。
  • $project: 一時的に作成した「id」フィールドを出力から除外し、結果を見やすく整えています。

まとめ

MongoDBで複数のドキュメントをマージする場合は、aggregate()の集計パイプラインを活用します。$groupステージで共通のキー(この例ではName)ごとにドキュメントをまとめ、$pushで配列を統合し、$sumで数値を合計することで、複数のドキュメントを効率的に1つに統合できます。データの集約やレポート作成など、さまざまな場面で応用できるテクニックなので、ぜひ活用してみてください。

  1. 複数のWord文書を1つに結合する方法|ブックマークを使った部分挿入も解説

    Microsoft Wordには、複数のWord文書を1つのファイルにまとめるための標準機能が搭載されています。複数の文書ファイルを最終的に1つのドキュメントへ統合する必要がある方にとって、非常に便利な機能です。 Word文書を結合する基本の流れ この標準機能は半手動的な操作になりますが、文書をどのように結合し、最終的なドキュメントのどこに挿入するかを細かくコントロールできるのが魅力です。作業をスムーズに進めるために、あらかじめ結合したい文書ファイルを同じフォルダーなど1か所にまとめておきましょう。 複数のWord文書の結合方法は、大きく分けて以下の2通りがあります。 ファイルの一部(ブック

  2. 複数のWord文書を1つにマージする方法【校閲・比較機能の使い方】

    Microsoft Wordは、ビジネスシーンで文書の作成・編集・保存に広く使われている定番のワープロソフトです。単にファイルを作成できるだけでなく、複数のレビュアーから送られてきた修正版の文書を1つに統合し、フィードバックを効率的に分析・反映できる点も大きなメリットです。 なぜ複数のWord文書を1つにまとめるのか? 文書を編集者やチームメンバーに送り、素早いレビューやフィードバック、改善提案をもらう場面はよくあるでしょう。レビュー後には、多くのレビュアーからの修正や変更が記されたWordファイルが何通も手元に届きます。これらをコピーアンドペーストで手作業的に統合すると、膨大な時間がかかるだ