Sto utilizzando l'aggregazione mongodb per aggregare un insieme di dati. La mia situazione è un po 'complessa. Ho una collezione come segue:Aggregazione Mongodb per giorno, quindi Ora
{
startTime: ISODate("2014-12-31T10:20:30Z"),
customerId: 123,
ping: "2",
link: "3"
}
Ora voglio aggregare i dati per un'altra raccolta come segue:
{
_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
}
]
}
Come potete vedere i dati è gruppo di giorno e poi per ore. Ho seguito la query di aggregazione per raggrupparli di giorno ma come raggrupparli ulteriormente per ore? Qualche idea?
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"}
}
}
];
Grazie. Potresti aiutarmi ulteriormente per favore? Ho uno schedulatore che verrà eseguito ogni ora per aggregare i dati dell'ultima ora come segue: '{" _id ": { " customerId ": 123," giorno ": ISODate (" 2012-06-20: 00: 00 : 00Z ")}, " ore ": [{" ora ": ISODate (" 2012-06-20: 01: 00: 00Z ")," ping ": 2," collegamenti ": 3}]}' Dopo eseguendo query di aggregazione sopra, ho bisogno di unire/inoltrare questa raccolta per archiviare i dati aggregati. Come posso ottenerlo? Grazie – user3756522
@ user3756522 Questo suona davvero come un'altra domanda ed è meglio chiederlo in quanto tale da un nuovo post in cui spieghi le tue intenzioni correttamente piuttosto che nei commenti. La query mostrata nella risposta verrà aggregata ogni giorno e ogni ora per l'intervallo che l'invio. Anche il tuo '$ match' per questo dovrebbe essere sempre il ** primo ** stadio della pipeline. Con MongoDB 2.6 l'output aggregato può essere un cursore che si itera per elaborare i risultati –