MongoDBでフィールドごとにドキュメントをグループ化して取得する方法
MongoDBで特定のフィールドを基準にドキュメントをグループ化して取得したい場合は、集計(Aggregation)パイプラインの $group と $project を組み合わせるのが基本です。この記事では、実際にコレクションを作成しながら、その手順を具体的に解説します。
1. サンプルコレクションの作成
まず、insertOne() メソッドを使って demo540 コレクションに複数のドキュメントを挿入します。
> db.demo540.insertOne({id:1,"Name":"Chris","CountryName":"US"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8ca368ef4dcbee04fbbc0e")
}
> db.demo540.insertOne({id:1,"Name":"Chris","CountryName":"UK"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8ca36bef4dcbee04fbbc0f")
}
> db.demo540.insertOne({id:1,"Name":"Chris","CountryName":"AUS"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8ca370ef4dcbee04fbbc10")
}
ここでは、同じ id と Name を持つ3件のドキュメントに対して、それぞれ異なる CountryName(US / UK / AUS)を設定しています。
2. find() で全ドキュメントを確認する
find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo540.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e8ca368ef4dcbee04fbbc0e"), "id" : 1, "Name" : "Chris", "CountryName" : "US" }
{ "_id" : ObjectId("5e8ca36bef4dcbee04fbbc0f"), "id" : 1, "Name" : "Chris", "CountryName" : "UK" }
{ "_id" : ObjectId("5e8ca370ef4dcbee04fbbc10"), "id" : 1, "Name" : "Chris", "CountryName" : "AUS" }
3. $group と $project でグループ化するクエリ
続いて、id と Name の組み合わせをキーとしてドキュメントをグループ化し、CountryName を配列にまとめるクエリを見ていきましょう。
> var query = [
... {
... "$group": {
... "_id": {
... "id": "$id",
... "Name": "$Name"
... },
... "details": {
... "$push": {
... "Name": "$Name",
... "CountryName": "$CountryName"
... }
... }
... }
... },
... {
... "$project": {
... "_id": "$_id.id",
... "Name": "$_id.Name",
... "details": 1
... }
... }
... ];
> db.demo540.aggregate(query).pretty();
クエリのポイント
- $group:
_idに$idと$Nameを指定することで、この2つのフィールドの値が同じドキュメント同士を1つのグループにまとめます。 - $push: グループ内の各ドキュメントから
NameとCountryNameを取り出し、detailsという配列フィールドに格納します。 - $project: 出力結果の形を整形します。
_id.idを新しい_idとして、_id.NameをNameとして表示し、details配列も出力に含めています。
4. 実行結果
上記の集計パイプラインを実行すると、次のような結果が出力されます。
{
"details" : [
{
"Name" : "Chris",
"CountryName" : "US"
},
{
"Name" : "Chris",
"CountryName" : "UK"
},
{
"Name" : "Chris",
"CountryName" : "AUS"
}
],
"_id" : 1,
"Name" : "Chris"
}
このように、id と Name が同じドキュメントが1つにまとめられ、それぞれの CountryName が details 配列の中に整理されて出力されます。
まとめ
MongoDBでフィールドごとにドキュメントをグループ化する場合は、$group でグルーピングのキーを定義し、$push で関連データを配列に集約、最後に $project で出力形式を整えるという流れが基本です。このパターンは、注文履歴を顧客ごとにまとめたり、タグごとに記事を集約したりといった実務的なシーンでも幅広く活用できます。
-
MongoDBの_idフィールドを非表示にする方法
MongoDBの_idフィールドを非表示にする方法MongoDBでは、find()メソッドでドキュメントを検索すると、デフォルトで_idフィールド(ObjectId)が必ず結果に含まれます。しかし、射影(プロジェクション)という仕組みを使えば、この_idフィールドを非表示にし、必要なフィールドだけを取得することが可能です。本記事では、具体的な手順をサンプルコード付きで解説します。1. コレクションとドキュメントの作成まず、サンプル用のコレクションを作成し、ドキュメントを挿入します。> db.demo575.insertOne({id:101, Information:{Name:&quo
-
$elemMatch演算子を使った配列フィールドを持つドキュメントの検索方法【MongoDB】
MongoDBで配列フィールド内の要素に基づいてドキュメントを検索したい場合、$elemMatch 演算子を使用します。$elemMatch を使うことで、配列内の同一の要素に対して複数の条件を同時に適用できるのが大きな特徴です。この記事では、実際にコレクションを作成し、配列フィールドを含むドキュメントを $elemMatch で照合する手順を解説します。1. テスト用コレクションの作成まず、配列フィールド details を持つドキュメントを挿入して、サンプルコレクションを作成しましょう。> db.demo592.insertOne( ... { ... id:1