2016-06-01 15 views
1

ich nächste Struktur meiner mongoDB Sammlung haben:MongoDB Aggregation mit vielen eingebetteten Dokumente

{ 
    "_id": "1", 
    "sessions": [ 
    { 
     "type": "default", 
     "pageViews": [ 
     { 
      "path": "/", 
      "host": "example.com", 
      "events": [ 
      { 
       "name": "event1" 
      }, 
      { 
       "name": "event1" 
      } 
      ] 
     } 
     ] 
    }, 
    { 
     "type": "default", 
     "pageViews": [ 
     { 
      "path": "/", 
      "host": "example.com", 
      "events": [ 
      { 
       "name": "event1" 
      }, 
      { 
       "name": "event1" 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

Ich brauche Anzahl der Sitzungen zu erhalten, Seiten und Ereignisse in einer Abfrage Gruppierung von _id Feld.

ich tun:

db.collection.aggregate([ 

    { 
     $unwind: "$sessions" 
    }, 

    { 
     $unwind: "$sessions.pageViews" 
    }, 

    { 
     $group: { 
      _id : "$_id", 
      totalEvents: { 
       $sum: { 
        $size: "$sessions.pageViews.events" 
       }, 
      }, 
      totalPageViews: { 
       $sum: 1 
      } 
     } 
    } 

]) 

Aber ich kann nicht verstehen, wie Anzahl der Sitzungen erhalten.

Wie kann ich die Anzahl der Sitzungen in dieser Abfrage ermitteln?

Danke!

Antwort

2

Versuchen Sie, die Sitzungen vor dem Abwickeln mit $ project zu zählen (verfügbar in mongodb 3.2). Dann sind die gesamten Sitzungen in der $group Bühne verfügbar. Sie können einfach nehmen die $first totalSessions für jeden _id wie alle Datensätze mit demselben _id die gleiche Anzahl von Sitzungen haben:

db.collection.aggregate([ 

    { $project : { sessions: 1, totalSessions : { $size : "$sessions" } } }, 

    { 
     $unwind: "$sessions" 
    }, 

    { 
     $unwind: "$sessions.pageViews" 
    }, 

    { 
     $group: { 
      _id : "$_id", 
      totalSessions: { $first : "$totalSessions" }, 
      totalEvents: { 
       $sum: { 
        $size: "$sessions.pageViews.events" 
       }, 
      }, 
      totalPageViews: { 
       $sum: 1 
      } 
     } 
    } 
]) 
+0

Danke! Stimmt. – LastRide

+0

Hilf mir bei http://StackOverflow.com/q/42212397/5230740. –