MongoDBで2つの列にまたがってグループ化する方法($lookup活用)
MongoDBで2つの列にまたがってグループ化するには?
MongoDBで2つのフィールド(列)にまたがってデータをグループ化したい場合は、集計パイプラインの$lookupステージを利用します。$lookupは自己結合(セルフジョイン)を実現するステージであり、同一コレクション内の異なるフィールド同士を照合して結びつけることが可能です。
本記事では、サンプルコレクションを作成し、実際に2つの列にまたがるグループ化を行うまでの手順を順番に解説します。
手順1:サンプルコレクションの作成
まずはinsertOne()メソッドを使って、テスト用のドキュメントを登録したコレクション「demo132」を作成します。
> db.demo132.insertOne({"CountryName1":"US","CountryName2":"UK",Value:50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e31950468e7f832db1a7f75")
}
> db.demo132.insertOne({"CountryName1":"UK","CountryName2":"AUS",Value:10});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e31951d68e7f832db1a7f76")
}
> db.demo132.insertOne({"CountryName1":"AUS","CountryName2":"US",Value:40});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e31952c68e7f832db1a7f77")
}手順2:登録済みドキュメントの確認
find()メソッドを実行して、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo132.find();
上記のクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e31950468e7f832db1a7f75"), "CountryName1" : "US", "CountryName2" : "UK", "Value" : 50 }
{ "_id" : ObjectId("5e31951d68e7f832db1a7f76"), "CountryName1" : "UK", "CountryName2" : "AUS", "Value" : 10 }
{ "_id" : ObjectId("5e31952c68e7f832db1a7f77"), "CountryName1" : "AUS", "CountryName2" : "US", "Value" : 40 }手順3:$lookupを使った2列にまたがるグループ化クエリ
以下が、MongoDBで2つの列(CountryName1とCountryName2)にまたがってグループ化を行うクエリです。$lookupで自分自身のコレクションと結合し、$unwindで配列を展開した後、$projectステージ内の$sum演算子によって両方のValueを合計しています。
> db.demo132.aggregate( [
... {
... "$lookup" : {
... "from" : "demo132",
... "localField" : "CountryName1",
... "foreignField" : "CountryName2",
... "as" : "out"
... }
... },
... {
... "$unwind" : "$out"
... },
... {
... "$project" : {
... "_id" : 0,
... "CountryName1" : 1,
... "total" : { "$sum" : [ "$Value", "$out.Value"]}
... }
... }
... ])
クエリを実行すると、次のような結果が出力されます。
{ "CountryName1" : "US", "total" : 90 }
{ "CountryName1" : "UK", "total" : 60 }
{ "CountryName1" : "AUS", "total" : 50 }結果の読み方
例えば「US」のtotalが90になっているのは、CountryName1が「US」のドキュメント(Value: 50)と、CountryName2が「US」のドキュメント(Value: 40)を$lookupで結合し、両者のValueを合計したためです。同様に「UK」は10+50=60、「AUS」は40+10=50という計算になります。
このように$lookup・$unwind・$projectを組み合わせることで、MongoDBでも複数の列をまたいだグループ化(集計)をシンプルに実現できます。国名やカテゴリのように相互に関連するフィールドを持つデータの分析に、ぜひ活用してください。
-
MySQLでテーブルを2つの列を使って並べ替える方法(ORDER BY句の使い方)
MySQLテーブルを2列で並べ替える基本構文 MySQLでは、ORDER BY句に複数の列をカンマ区切りで指定することで、2つ以上の列を基準にテーブルを並べ替えることができます。基本的な構文は以下の通りです。 ORDER BY 列名1 DESC, 列名2 DESC; このように記述すると、まず「列名1」で並べ替えが行われ、同じ値が存在する場合にのみ「列名2」が優先順位として使われます。昇順にしたい場合は ASC を指定します(省略した場合もデフォルトは昇順です)。 サンプルテーブルの作成 まず、例として使用するテーブルを作成します。 mysql> CREATE TABLE OrderB
-
MySQLで2つの列を連結する方法:CONCAT()関数の使い方を解説
MySQLで列を連結する基本 MySQLで2つの列の値を1つに連結したい場合は、CONCAT()関数を使用します。氏名と年齢のように、別々の列に保存されているデータを組み合わせて表示したい場面は多くあります。CONCAT()関数を使えば、SQLクエリだけで簡単に実現できます。 CONCAT()関数の構文 基本的な構文は以下のとおりです。 SELECT CONCAT(カラム名1, , カラム名2) AS 任意の別名 FROM テーブル名; 第2引数の (スペース)を挟むことで、連結した値の間に空白を挿入できます。区切り文字は自由に指定可能です。 サンプルテーブルの作成 実際に動作を確認す