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

MongoDBでMySQLのUNIONに似たクエリを実装する方法

MySQLのUNIONに相当するクエリをMongoDBで実現したい場合は、aggregate()と$lookup(JOIN)を組み合わせることで実装できます。この記事では、2つのコレクションを結合して集計する具体的な手順を、サンプルコードとともに解説します。

最初のコレクション(demo486)を作成する

まず、ドキュメントを含むコレクションを作成します。

> db.demo486.insertOne({_id:1,"Amount":30,"No":4});
{ "acknowledged" : true, "insertedId" : 1 }
> db.demo486.insertOne({_id:2,"Amount":40,"No":2});
{ "acknowledged" : true, "insertedId" : 2 }
> db.demo486.insertOne({_id:3,"Amount":60,"No":6});
{ "acknowledged" : true, "insertedId" : 3 }

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

> db.demo486.find();

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

{ "_id" : 1, "Amount" : 30, "No" : 4 }
{ "_id" : 2, "Amount" : 40, "No" : 2 }
{ "_id" : 3, "Amount" : 60, "No" : 6 }

2つ目のコレクション(demo487)を作成する

続いて、結合先となる2つ目のコレクションをドキュメント付きで作成します。

> db.demo487.insertOne({_id:1,"Price":10,"No":4});
{ "acknowledged" : true, "insertedId" : 1 }
> db.demo487.insertOne({_id:2,"Price":80,"No":9});
{ "acknowledged" : true, "insertedId" : 2 }
> db.demo487.insertOne({_id:3,"Price":20,"No":6});
{ "acknowledged" : true, "insertedId" : 3 }

こちらもfind()メソッドで、コレクション内のすべてのドキュメントを確認します。

> db.demo487.find();

実行結果は以下のとおりです。

{ "_id" : 1, "Price" : 10, "No" : 4 }
{ "_id" : 2, "Price" : 80, "No" : 9 }
{ "_id" : 3, "Price" : 20, "No" : 6 }

UNIONに相当するクエリを実行する

それでは、2つのコレクションを結合して集計するクエリを見ていきましょう。$lookupでコレクションを結合し、$unwindで配列を展開、$groupで「No」ごとに「Amount」と「Price」の合計を計算しています。最後に$sortと$projectで結果を整形します。

> db.getCollection('demo486').aggregate([
... {$lookup : { from : "demo487",localField : "No", foreignField :"No", as:"demo487"}},
... {$unwind : "$demo487"},
... {
...     $group : {
...        _id : {
...           No :"$No",
...        },
...        TotalValue : { $sum : { $add: [ "$Amount", "$demo487.Price" ] }}
...     }
... },
... {$sort : {"_id.No":1}},
... {
...     $project : {
...        No :"$_id.No",
...        TotalValue : 1,
...        _id : 0
...     }
... }
... ])

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

{ "TotalValue" : 40, "No" : 4 }
{ "TotalValue" : 80, "No" : 6 }

このように、MongoDBではaggregate()パイプラインの各ステージを組み合わせることで、MySQLのUNIONやJOINに近い処理を柔軟に実現できます。$lookupによる結合、$groupによる集計、$projectによる出力フィールドの制御など、目的に応じてステージを追加・調整してみてください。

  1. MySQLでUNIONクエリの結果をカウントする方法を徹底解説

    MySQLでは、UNION(ユニオン)で結合した結果セットの件数を取得したい場面がよくあります。本記事では、サブクエリとCOUNT(*)関数を組み合わせて、UNIONの結果をカウントする方法を具体例とともに解説します。 UNIONの結果をカウントする基本構文 UNIONの結果件数を取得するには、UNIONクエリをFROM句の中にサブクエリとして記述し、その外側でCOUNT(*)を実行します。基本となる構文は以下の通りです。 SELECT COUNT(*) FROM ( SELECT yourColumName1 FROM yourTableName1 UNION S

  2. 同じサンプルで比較する!MySQLのWHERE IN句とORの違いと実装方法

    MySQLでは、条件指定にIN句を使用した場合とOR演算子を使用した場合で、インデックスの扱いが異なることが知られています。一般的に、IN句はインデックスを利用できるのに対し、ORで複数条件をつなげた場合はインデックスが使用されないケースがあります。この記事では、同じテーブルとデータを使って、IN句とORそれぞれの書き方と実行結果を比較しながら解説します。1. サンプルテーブルの作成まず、以下のCREATE TABLE文でテーブルを作成します。mysql> create table DemoTable711 (    Id int,  &