2016-08-23 29 views
3

私はテーブルで "グループ"を実行し、別のテーブルと "結合"しようとしています。 対応するSQL文は次のようになります。

SELECT T1.total, T1.email, T1.type, table_2.name FROM 
(SELECT SUM(amount) AS total, email, type 
FROM table_1 
GROUP BY email, type) T1 
INNER JOIN table_2 
on T1.email = table_2.email 

しかし、MongoDBのは、まだ内部は機能に参加していないので、私は「$検索」を使用してタスクを実行しようとしました。 、

db.table_1.aggregate([ 
{$group : {_id : {email: "$email", type:"$type"},total: { $sum: "$amount" }}}, 
{$lookup: {from: "table_2", localField: "email", foreignField: "email", as: "details"}} ]); 

しかし、私は取得していた結果で戻り、空のオブジェクトを詳細:ここに私のコードです

{ "_id" : { "user" : "[email protected]", "type" : "Car" }, "total" : 2, "details" : [ ] } 
{ "_id" : { "user" : "[email protected]", "type" : "Bike" }, "total" : 3, "details" : [ ] } 
{ "_id" : { "user" : "[email protected]", "type" : "Car" }, "total" : 1, "details" : [ ] } 

しかし、私は$グループを使用せずにクエリを実行した場合、それが正常に動作します。ですから、$ groupと$ lookup関数を一緒に使うことができないのだろうかと思います。もしそうなら、回避策がありますか、またはクエリを実行する最適な方法は何ですか?

[私が使用しているのmongo DBバージョン:> db.version()3.2.7]

あなた $検索がのJOIN INNERように動作するようにしたい場合は

答えて

10

私はこの問題への答えを見つけました。私が空の配列を得たのは、$ lookupの中でlocalFieldを使った方法でした。

私はtable_1の$ groupの結果でtable_2に参加しようとしているので、ローカルフィールドは "_id.email"でなければなりません。

ので、作業クエリは次のようになります。

+0

意味があります。私はあなたが一致していたはずの電子メールアドレスの空の配列を取得していたことに気付かなかった。 – Wake

2

、つまり、あなたがドン」

db.table_1.aggregate([ 
    {$group : {_id : {email: "$email", type:"$type"},total: { $sum: "$amount" }}}, 
    {$lookup: {from: "table_2", localField: "email", foreignField: "email", as: "details"}}, 
    {$match: {details: {$ne: []}}} 
]); 
+0

おかげでウェイク助けを

db.table_1.aggregate([ {$group : {_id : {email: "$email", type:"$type"},total: { $sum: "$amount" }}}, {$lookup: {from: "table_2", localField: "_id.email", foreignField: "email", as: "details"}}, {$match: {details: {$ne: []}}} ]); 

おかげ@Wakeと@Clement。私は最終的に答えを思いついた。おかげさまでクレメント。 – KTB

1

モンゴから:ルックアップテーブル内の少なくとも1つのマッチング文書が存在しない限り、tは結果をしたい、あなたは空の配列[]にあなたのルックアップテーブルの結果を比較終わりに$マッチを追加することができますその逆3.2以降では、左外部結合をサポートするために$ lookupが使用されます。

私は$グループと$ルックアップ機能を一緒 を使用することはできませんかどうか迷っています。

$ groupと$ lookupを一緒に使用できます。 INNERが

のJOINのためにそれを使用する方法

あなたは結果をフィルタリングするもう一つの条件を追加しています。 $ matchを使用します。 $ inで試すこともできます。

参照

https://www.mongodb.com/blog/post/joins-and-other-aggregation-enhancements-coming-in-mongodb-3-2-part-1-of-3-introduction

http://www.clusterdb.com/mongodb/joins-and-other-aggregation-enhancements-in-mongodb-3-2

https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

https://docs.mongodb.com/manual/reference/operator/aggregation/match/

+0

私は最終的に答えを思いついた。 – KTB

関連する問題