MongoDBで$lookupを使い、他のコレクションの一致するフィールドに基づいてJSON配列フィールドを集計する方法
MongoDBでは、$lookupを使用することで、あるコレクションのフィールドと別のコレクションのフィールドを照合し、JSON配列フィールドを集計できます。この記事では、実際に2つのコレクションを作成してドキュメントを追加し、$lookupによる照合と集計の手順を具体的なコード例とともに解説します。
ステップ1:最初のコレクションを作成する
まず、insertOne()メソッドを使って、商品ID(PId)を含む配列を持つドキュメントをコレクション「demo101」に挿入します。
> db.demo101.insertOne(
... { "_id" : "1", "Details" : [ { "PId" : "200" }, { "PId" : "201" }, { "PId" : "201" } ] }
... )
{ "acknowledged" : true, "insertedId" : "1" }ドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo101.find();
実行すると、次のような出力が得られます。
{ "_id" : "1", "Details" : [ { "PId" : "200" }, { "PId" : "201" }, { "PId" : "201" } ] }ステップ2:2番目のコレクションを作成する
続いて、顧客のメールアドレス情報を格納する2番目のコレクション「demo102」を作成します。ここではID「201」に対応するメールアドレスを登録しています。
> db.demo102.insertOne(
... { "_id" : "201", "CustEmailId" : "Carol@gmail.com" }
... );
{ "acknowledged" : true, "insertedId" : "201" }ドキュメントの確認
find()メソッドで、このコレクション内のすべてのドキュメントを表示してみましょう。
> db.demo102.find();
実行すると、次のような出力が得られます。
{ "_id" : "200", "CustEmailId" : "John@gmail.com" }
{ "_id" : "201", "CustEmailId" : "Carol@gmail.com" }ステップ3:$lookupを使った集計クエリを実行する
以下が、他のコレクションの一致するフィールドをもとに、JSON配列フィールドを集計するためのクエリです。この集計パイプラインでは、まず$unwindで「Details」配列を展開し、次に$lookupでdemo102コレクションと結合します。その後、$projectと$arrayElemAtでメールアドレスを取り出し、最後に$groupと$pushで元のドキュメント単位に配列を再構築しています。
> db.demo101.aggregate(
... [
... {$unwind:"$Details"},
... {$lookup : {from : "demo102", "localField":"Details.PId", "foreignField":"_id", as :"out"}},
... {$project : {"_id":1, "Details.PId":{$arrayElemAt:["$out.CustEmailId",0]}}},
... {$group:{_id:"$_id", Details : {$push : "$Details"}}}
... ]
... ).pretty()実行結果
このクエリを実行すると、次のような出力が得られます。「PId」の値が、demo102コレクションから照合して取得したメールアドレスに置き換えられていることがわかります。同じID「201」が複数存在する場合でも、それぞれ対応するメールアドレスが正しく割り当てられます。
{
"_id" : "1",
"Details" : [
{
"PId" : "John@gmail.com"
},
{
"PId" : "Carol@gmail.com"
},
{
"PId" : "Carol@gmail.com"
}
]
}このように、$unwind・$lookup・$project・$groupを組み合わせた集計パイプラインを使えば、配列フィールドの各要素を別のコレクションのデータと結合し、柔軟に変換・集計することが可能です。
-
MongoDBでaggregate()を使ってフィールドごとにグループ化し、件数を集計する方法
MongoDBでの集計とグループ化の基本MongoDBのaggregate()メソッドでは、$groupステージを利用することで、コレクション内のドキュメントを特定のフィールドの値ごとにグループ化し、件数を集計できます。本記事では、実際にサンプルコレクションを作成しながら、その手順をわかりやすく解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成します。> db.demo616.insertOne({"details":{"Name":"Chris",&
-
MongoDBコレクション内のすべてのドキュメントに新しいフィールドを追加する方法
MongoDBコレクション内のすべてのドキュメントに新しいフィールドを追加する方法MongoDBで既存のドキュメントに新しいフィールドを追加するには、集計パイプラインの$addFieldsステージを使用します。まずは、サンプルとなるコレクションとドキュメントを作成してみましょう。サンプルコレクションの作成insertOne()メソッドを使用して、ドキュメントを1件ずつ挿入します。> db.demo712.insertOne({Name:John}); { acknowledged : true, insertedId : ObjectId(5ea85f675d33e20ed1