2016-08-23 6 views
3

Ich versuche, eine "Gruppe von" auf einer Tabelle durchzuführen und sie mit einer anderen Tabelle zu verbinden. entsprechende SQL-Anweisung wäre:

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 

Aber da mongodb immer noch nicht haben INNER JOIN-Funktion habe ich versucht, „$ Lookup“ und tun, um die Aufgabe zu verwenden. hier ist mein Code:

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

Aber in den Ergebnissen Ich erhalte Details kehrt und leeres Objekt:

{ "_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" : [ ] } 

Aber wenn ich die Abfrage ohne Verwendung von $ Gruppe laufen, es funktioniert gut. Ich frage mich also, ob die Funktionen $ group und $ lookup nicht zusammen verwendet werden können. Wenn ja, gibt es einen Workaround oder was wäre der optimale Weg, um die Anfrage zu erledigen?

[Mongo db Version Ich verwende:> db.version() 3.2.7]

Antwort

10

fand ich die Antwort auf das Problem. Der Grund, warum ich ein leeres Array hatte, war die Art und Weise, wie ich das localField im $ Lookup verwendet habe.

Da ich versuche, die Tabelle_2 mit dem $ Gruppenergebnis der Tabelle_1 beizutreten, sollte das lokale Feld "_id.email" sein.

So würde die Arbeits Abfrage sein:

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: []}}} 
]); 

Dank @Wake und @Clement Hilfe

+0

Sinn macht. Ich habe nicht bemerkt, dass Sie das leere Array für die E-Mail-Adresse erhalten haben, das passen sollte. – Wake

2

Wenn Sie Ihre $ Lookup arbeiten wie ein INNER JOIN wollen, das heißt, Sie don‘

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

Dank Wake. Ich kam schließlich auf die Antwort. – KTB

1

Von Mongo: t Ergebnisse wollen, wenn mindestens ein passendes Dokument in der Lookup-Tabelle ist, können Sie eine $ passen am Ende vergleichen Ihre Lookup-Tabelle Ergebnisse auf ein leeres Array [] hinzufügen vers Ab 3.2 wird $ lookup zur Unterstützung von Links-Outer-Joins verwendet.

Ich frage mich, ob die $ Gruppe und $ Lookup-Funktionen nicht zusammen verwendet werden können.

$ Gruppe und $ Lookup können zusammen verwendet werden.

Wie es für INNER verwenden

Sie haben JOIN eine weitere Bedingung hinzufügen, um die Ergebnisse zu filtern. Benutze $ match. Sie können auch mit $ in versuchen.

Referenzen

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

Danke Clement. Ich kam schließlich auf die Antwort. – KTB