2015-05-06 7 views
5

Ich hat einen Datensatz sieht aus, alsZählung mehr verschiedene Felder, die durch Gruppe mit Mongo

{"BrandId":"a","SessionId":100,"UserName":"tom"} 
{"BrandId":"a","SessionId":200,"UserName":"tom"} 
{"BrandId":"b","SessionId":300,"UserName":"mike"} 

Ich mag würde unterschiedliche Sitzungs- und Benutzergruppe von brandid zählen, die Probe SQL ist wie:

select brandid,count_distinct(sessionid),count_distinct(username) 
from data 
group by brandid 

Ich habe versucht, Mongo DB zu schreiben, mein aktueller Code ist wie folgt und es funktioniert nicht. Gibt es das überhaupt, damit es funktioniert?

db.logs.aggregate([ 
    {$group:{ 
     _id:{brand:"$BrandId",user:"$UserName",session:"$SessionId"}, 
     count:{$sum:1}}}, 
    {$group:{ 
     _id:"$_id.brand", 
     users:{$sum:"$_id.user"}, 
     sessions:{$sum:"$_id.session"} 
    }} 
]) 

für das bestimmte Beispiel die erwartete Anzahl ist

{"BrandId:"a","countSession":2,"countUser":1} 
{"BrandId:"b","countSession":1,"countUser":1} 

, wenn Sie SQL wissen, das erwarten Ergebnis als gleiche wie die SQL ich erwähnt.

+0

@JohnnyHK Nr. Definitiv ist es nicht das Problem. Wenn Sie wissen, wie Sie mehrere Felder zählen, lassen Sie es mich wissen. – erkpwejropi

+1

Was ist die erwartete/gewünschte Ausgabe? – chridam

+0

@chridam Ich füge erwartete Ausgabe in Frage. Bitte helfen Sie – erkpwejropi

Antwort

3

Sie können dies tun, indem $addToSet mit dem unterscheidbaren Satz von SessionId und UserName Werte während der $group, und dann das Hinzufügen einer $project Stufe der Pipeline zu akkumulieren, der die $size Betreiber verwendet die Größe eines jeden Satzes zu erhalten:

db.logs.aggregate([ 
    {$group: { 
     _id: '$BrandId', 
     sessionIds: {$addToSet: '$SessionId'}, 
     userNames: {$addToSet: '$UserName'} 
    }}, 
    {$project: { 
     _id: 0, 
     BrandId: '$_id', 
     countSession: {$size: '$sessionIds'}, 
     countUser: {$size: '$userNames'} 
    }} 
]) 

Ergebnis:

{ 
    "BrandId" : "b", 
    "countSession" : 1, 
    "countUser" : 1 
}, 
{ 
    "BrandId" : "a", 
    "countSession" : 2, 
    "countUser" : 1 
} 
Verwandte Themen