2016-06-20 10 views
0

Ich bin ziemlich neu in Mongo db und komme aus T-SQL-Hintergrund, ich finde wenig schwer zu verstehen, wie Joins in Mongo arbeiten.Mongo DB Join Collections

Ich habe einen sehr einfachen Fall, dass ich eine haben "User Table .. err .. Sammlungen" und "User Audit Collections" ..

Meine User Collection sieht ungefähr so ​​aus.

{ 
    "_id": LUUID("d991e92a-766c-054e-9ad8-1c902acc6efc"), 
    "System": { 
    "VisitCount": 1 
    }, 
    "UserData": { 
    "Uid": "46831", 
    "UserName": "abc.", 
    "FirstName": "abv", 
    "LastName": "test", 
    "EmailId": "[email protected]", 
    "Region": "Georgia", 
    "Postal": "10000", 
    "Country": "United States", 
    "Phone": "800-000-1734", 
    } 
} 

und ein User-Audit-Tabelle:

{ 
    "_id": LUUID("9561a583-0afe-e844-a090-43ffdab46ed2"), 
    "UserId": LUUID("914ed252-3fc7-d84c-9731-f382e7cf400b"), 
    "StartDateTime": ISODate("2016-05-12T04:07:37.299Z"), 
    "EndDateTime": ISODate("2016-05-12T04:07:42.715Z"), 
    "SaveDateTime": ISODate("2016-05-12T04:28:23.186Z"), 
    "Browser": { 
    "BrowserVersion": "50.0", 
    "BrowserMajorName": "Chrome", 
    "BrowserMinorName": "50.0" 
    }, 
    "Pages": [ 
    { 
     "DateTime": ISODate("2016-05-12T04:07:37.365Z"), 
     "Duration": 5416, 
     "Item": { 
     "_id": LUUID("f293157a-f22d-fe49-a7b0-f66f412408fe"), 
     "Language": "en", 
     "Version": 1 
     }"Url": { 
     "Path": "/" 
     }, 
     "VisitPageIndex": 1 
    }, 
    { 
     "DateTime": ISODate("2016-05-12T04:07:42.781Z"), 
     "Duration": 0, 
     "Item": { 
     "Version": 0 
     }, 
     "SitecoreDevice": { 
     "_id": LUUID("df7f5dfe-c089-994d-9aa3-b5fbd009c9f3"), 
     "Name": "Default" 
     }, 
     "MvTest": { 
     "ValueAtExposure": 0 
     }, 
     "Url": { 
     "Path": "/Sample Page1" 
     }, 
     "VisitPageIndex": 2 
    } 
    ] 
} 

Ich brauche eine Wohnung Ansicht, in der jede Zeile alle Benutzer Benutzerinformation halten und die Seiten der Benutzer besucht.
Die Überwachungsinformationen können nach Benutzer gruppiert oder pro Benutzer wiederholt werden. Meine Hauptidee besteht darin, die Benutzerdetails mit der besuchten Seite zu verknüpfen.

Ich suche so etwas wie ein LEFT OUTER JOIN Äquivalent

so etwas wie

Select * from usertable, useraudittable 
on usertable.id = userAuditTable.UserId 
group by userID. 

Antwort

0

Mongo ist eine einfache Datenbank Objektspeicher und nicht viel relationalen Operationen anbieten möchten verbindet. Normalerweise müssen Sie programmatisch mehrere Abfragen durchführen und die Daten mit Ihrem Anwendungscode und Ihrer Logik verarbeiten.

In Mongo 3.2 führten sie die Nachschlageoperation in die Aggregationspipeline ein und zum Glück macht sie das, wonach Sie suchen. Sie können so etwas wie diese (mit Mongo Shell JavaScript-Syntax als Beispiel)

db.user.aggregate([{ 
    $lookup: { 
     from: "audit", 
     localField: "_id", 
     foreignField: "UserId", 
     as: "VisitedPages" 
     }  
}]); 

Wenn Sie mit der letzten Version von Mongo verwenden Sie mit diesem Ansatz spielen können, sonst müssen Sie mit mehreren Abfragen auf Ihrer Anwendung gehen .

Werfen Sie einen Blick auf die documentation

+0

Dank Andre .. Ich war zufällig das gleiche Dokument überprüft und ich lief genau die gleiche Abfrage .. ich bin immer Ergebnisse zurück .. aber sie sind nicht mehr als 50 ist, dass eine Einschränkung? –

+0

Entschuldigung für die lange Zeit. Ich habe Ihre Beispieldaten lokal ausprobiert und 67 Audit-Datensätze eingefügt und alle mithilfe der oben genannten Aggregationsabfrage erfasst. Ich bin mir keiner Beschränkung bewusst, besonders solch eine niedrige Zahl wie 50. Aber Sie können vorsichtig sein, wenn Sie so große Dokumente zusammenfügen, Sie werden einige Speicher- und Leistungsprobleme bekommen. Sie können die Felder, die von der Aggregationspipeline zurückgegeben werden, immer einschränken. – andre

+0

Danke. Ich erkannte, dass dies eine Einschränkung mit GUI ist. RoboMongo gab nur 50 Datensätze zurück. Ich konnte die Aufzeichnungen von Mongobooster und Slamdata bekommen. –