2017-09-13 5 views
0

J'essaie de comprendre ce cadre d'agrégation, et je suis coincé, j'aimerais de l'aide.Comment agréger un groupe avec un tableau filtré et une somme filtrée?

J'ai une collection d'événements, ce regard simplifié et déjà filtré quelque chose de similaire à ceci:

{ creation: 54233, eventName: "elapsedTime", userId: 1, url: "/thing/53e245ca", data: { number: 5 } }, 
{ creation: 64033, eventName: "elapsedTime", userId: 1, url: "/thing/53e245ca", data: { number: 3 } }, 
{ creation: 50298, eventName: "elapsedTime", userId: 1, url: "/thing/53e245ca", data: { number: 2 } }, 
{ creation: 74220, eventName: "toggle",  userId: 1, url: "/thing/53e245ca", data: { status: true } }, 
{ creation: 84233, eventName: "elapsedTime", userId: 2, url: "/thing/190345a9", data: { number: 8 } }, 
{ creation: 59511, eventName: "elapsedTime", userId: 2, url: "/thing/190345a9", data: { number: 10 } }, 
{ creation: 14236, eventName: "toggle",  userId: 2, url: "/thing/190345a9", data: { status: false } }, 
{ creation: 80637, eventName: "toggle",  userId: 2, url: "/thing/cc2b8b91", data: { status: true } }, 
{ creation: 99239, eventName: "toggle",  userId: 2, url: "/thing/cc2b8b91", data: { status: false } } 

Et je veux qu'ils soient agrégés comme ceci:

{ 
    userId: 1, 
    toggles: [ 
     { creation: 74220, url: "/thing/53e245ca", data: { status: true } } 
    ], 
    elapsedSum: 10 
}, 
{ 
    userId: 2, 
    toggles: [ 
     { creation: 14236, url: "/thing/190345a9", data: { status: false } }, 
     { creation: 80637, url: "/thing/cc2b8b91", data: { status: true } }, 
     { creation: 99239, url: "/thing/cc2b8b91", data: { status: false } }, 
    ], 
    elapsedSum: 18 
} 

Je essentiellement voulez regrouper par utilisateur, avoir la somme de tous elapsedTime pour chaque utilisateur, et avoir un tableau de tous les événements toggle pour chaque utilisateur.

Répondre

1
db.getCollection('heya').aggregate([ 
    { 
    "$group": { 
     "_id": "$userId", 
     "toogles": { 
     "$addToSet": { 
      "$cond": { 
      "if": { 
       "$eq": [ 
       "$eventName", 
       "toggle" 
       ] 
      }, 
      "then": { 
       "creation": "$creation", 
       "url": "$url", 
       "data": "$data" 
      }, 
      "else": null 
      } 
     } 
     }, 
     "elapsedSum": { 
     "$sum": { 
      "$cond": { 
      "if": { 
       "$eq": [ 
       "$eventName", 
       "elapsedTime" 
       ] 
      }, 
      "then": "$data.number", 
      "else": 0 
      } 
     } 
     } 
    } 
    } 
]) 

Vous pouvez remplacer null du tableau ou détendez-vous pour obtenir le résultat

+0

Wow je ne sais pas comment nécessaire je ne pensais pas à cela. C'était plus simple que je ne le pensais. Merci beaucoup! –