2013-07-25 85 views
1

我有一個聚合,在日期上分組並創建一個總和。使用不同的MongoDB聚合

db.InboundWorkItems.aggregate({ 
    $match: { 
     notificationDate: { 
      $gte: ISODate("2013-07-18T04:00:00Z") 
     }, 
     dropType: 'drop' 
    } 
}, { 
    $group: { 
     _id: { 
      notificationDate: "$notificationDate" 
     }, 
     nd: { 
      $first: "$notificationDate" 
     }, 
     count: { 
      $sum: 1 
     } 
    } 
}, { 
    $sort: { 
     nd: 1 
    } 
}) 

輸出是

"result" : [ 
    { 
     "_id" : { 
      "notificationDate" : ISODate("2013-07-18T04:00:00Z") 
     }, 
     "nd" : ISODate("2013-07-18T04:00:00Z"), 
     "count" : 484 
    }, 
    { 
     "_id" : { 
      "notificationDate" : ISODate("2013-07-19T04:00:00Z") 
     }, 
     "nd" : ISODate("2013-07-19T04:00:00Z"), 
     "count" : 490 
    }, 
    { 
     "_id" : { 
      "notificationDate" : ISODate("2013-07-20T04:00:00Z") 
     }, 
     "nd" : ISODate("2013-07-20T04:00:00Z"), 
     "count" : 174 
    }, 
    { 
     "_id" : { 
      "notificationDate" : ISODate("2013-07-21T04:00:00Z") 
     }, 
     "nd" : ISODate("2013-07-21T04:00:00Z"), 
     "count" : 6 
    }, 
    { 
     "_id" : { 
      "notificationDate" : ISODate("2013-07-22T04:00:00Z") 
     }, 
     "nd" : ISODate("2013-07-22T04:00:00Z"), 
     "count" : 339 
    }, 
    { 
     "_id" : { 
      "notificationDate" : ISODate("2013-07-23T04:00:00Z") 
     }, 
     "nd" : ISODate("2013-07-23T04:00:00Z"), 
     "count" : 394 
    }, 
    { 
     "_id" : { 
      "notificationDate" : ISODate("2013-07-24T04:00:00Z") 
     }, 
     "nd" : ISODate("2013-07-24T04:00:00Z"), 
     "count" : 17 
    } 
], 
"ok" : 1 

到目前爲止好。我現在需要做的是保持這一點,但也添加了一個獨特的標準(爲了參數的緣故,我想使用AccountId)。這將使我分組日期的計數只使用不同的AccountId。在聚合框架中甚至有可能是獨特的?

回答

0

您可以在管道中使用兩個組命令,第一個按照accoundId分組,第二個組按慣例操作。是這樣的:

db.InboundWorkItems.aggregate( 
    {$match: {notificationDate: {$gte: ISODate("2013-07-18T04:00:00Z")}, dropType:'drop' }}, 
    {$group: {_id:"accountId",notificationDate:"$notificationDate"}}, 
    {$group: {_id:1, nd: {$first:"$notificationDate"}, count:{$sum:1} }}, 
    {$sort:{nd:1}} ) 
+0

指的是這裏的最後一行,從SQL獨特映射到等效的mongo操作:http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/ – Jayz

+0

這絕對不是工作,因爲第一組將會擺脫現場notificationDate。 – zsong

+0

是,對不起,忽略了。所以將notificationDate添加到第一組。看到編輯答案。 – Jayz

0
db.InboundWorkItems.aggregate({ 
    $match: { 
     notificationDate: { 
      $gte: ISODate("2013-07-18T04:00:00Z") 
     }, 
     dropType: 'drop' 
    } 
}, { 
    $group: { 
     _id: "$AccountId", 
     notificationDate: { 
      $max: "$notificationDate" 
     }, 
     dropType: { 
      $max: "$dropType" 
     } 
    } 

}, { 
    $group: { 
     _id: { 
      notificationDate: "$notificationDate" 
     }, 
     nd: { 
      $first: "$notificationDate" 
     }, 
     count: { 
      $sum: 1 
     } 
    } 
}, { 
    $sort: { 
     nd: 1 
    } 
}) 
0

我想你實際上可能會尋找一個組(英文是有點混亂),像這樣:

db.InboundWorkItems.aggregate({ 
    $match: { 
     notificationDate: { 
      $gte: ISODate("2013-07-18T04:00:00Z") 
     }, 
     dropType: 'drop' 
    } 
}, { 
    $group: { 
     _id: { 
      notificationDate: "$notificationDate", accountId: '$accountId' 
     }, 
     nd: { 
      $first: "$notificationDate" 
     }, 
     count: { 
      $sum: 1 
     } 
    } 
}, { 
    $sort: { 
     nd: 1 
    } 
}) 

我添加了複合_id在$組因爲:

這將使我分組的日期只使用不同的AccountId的計數。

這讓我覺得你想按帳號ID分組日期。