我正在使用mongodb聚合來聚合數據集。我的情況有點複雜。我有一個集合如下:Mongodb聚集按天然後小時
{
startTime: ISODate("2014-12-31T10:20:30Z"),
customerId: 123,
ping: "2",
link: "3"
}
現在我要彙總數據,另一個收集如下:
{
_id: {
day: ISODate("2014-12-31T00:00:00Z"),
customerId: 123
},
hours: [
{
hour: ISODate("2014-12-31T10:00:00Z"),
pings: 2,
links: 3
},
{
hour: ISODate("2014-12-31T11:00:00Z"),
pings: 5,
links: 6
}
]
}
正如你所看到的數據是按照日期分組,然後再由小時。我有以下的聚合查詢來將它們分組,但是如何將它們按小時進一步分組?任何想法?
var pipeline = [
{
$project : {
startTime : 1,
customerId: 1,
ping:1,
link:1,
date : "$startTime",
h : {
"$hour" : "$startTime"
},
m : {
"$minute" : "$startTime"
},
s : {
"$second" : "$startTime"
},
ml : {
"$millisecond" : "$startTime"
}
}
},
{
$project: {
startTime : 1,
customerId: 1,
ping:1,
link:1,
date : {
"$subtract" : [
"$date",
{
"$add" : [
"$ml",
{
"$multiply" : [
"$s",
1000
]
},
{
"$multiply" : [
"$m",
60,
1000
]
},
{
"$multiply" : [
"$h",
60,
60,
1000
]
}
]
}
]
}
}
},
{
$match: {
"startTime": {
$gte: new ISODate("2013-12-01T07:00:00Z"),
$lte: new ISODate("2014-01-01T08:00:00Z"),
}
}
},
// Aggregate the data
{
$group: {
_id: {day : "$date", customerId: "$customerId"},
pings : {$sum: "$ping"},
links : {$sum: "$links"}
}
}
];
謝謝。你能幫我進一步嗎?我有一個調度程序,每小時運行一次,以聚合上一小時的數據,如下所示:'{「_id」:{customerId「:123,」day「:ISODate(」2012-06-20:00:00 :00Z「)}, 」hours「:[{」hour「:ISODate(」2012-06-20:01:00:00Z「),」ping「:2,」links「:3}]}'After上面運行聚合查詢,我需要合併/插入到這個集合來存儲聚合數據。我怎樣才能做到這一點?謝謝 – user3756522
@ user3756522這真的聽起來像是另一個問題,最好通過一個新的帖子問你,因爲你正確地解釋你的意圖而不是評論。答案中顯示的查詢將根據您發送的範圍每天和每小時彙總一次。此外,您的'$ match'應該始終是管道**的第**個**階段。使用MongoDB 2.6,您的聚合輸出可以是您迭代處理結果的遊標 –