2017-09-13 7 views
0

私はこの集約フレームワークの周りに頭を抱えようとしています。私は固執しています。私はいくつかの助けが大好きです。フィルタリングされた配列とフィルタされた合計でグループ化を集計する方法は?

だから私は、これに似ている単純化され、すでにフィルタールック何かイベントのコレクションを持っている:

{ 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 } } 

をそして、私は彼らがこのように集約することにしたい。だから私は基本的

{ 
    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 
} 

ユーザーごとにグループ化し、すべてのユーザーの合計がelapsedTimeになり、各ユーザーにすべてのtoggleイベントの配列があります。

答えて

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 
      } 
     } 
     } 
    } 
    } 
]) 

あなたがarrayからヌル交換したり、うわー、私はそのことを考えていなかったのか分からない必要な結果

+0

を得るためにそれをほどくことがあります。それは私が思ったよりも簡単だった。どうもありがとうございました! –

関連する問題