Używam agregacji mongodb do agregowania zestawu danych. Moja sytuacja jest nieco skomplikowana. Mam kolekcję w następujący sposób:Agregacja Mongodb według dnia, następnie Godzina
{
startTime: ISODate("2014-12-31T10:20:30Z"),
customerId: 123,
ping: "2",
link: "3"
}
Teraz chcę do agregowania danych do innej kolekcji w następujący sposób:
{
_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
}
]
}
Jak widać dane jest grupa na dzień, a potem przez godziny. Mam następujące zapytanie o agregację, aby je pogrupować według dnia, ale jak pogrupować je według godzin? Dowolny pomysł?
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"}
}
}
];
Dzięki. Czy możesz mi jeszcze bardziej pomóc? Mam harmonogram, który będzie działał co godzinę, aby zebrać dane z ostatniej godziny w następujący sposób: '{" _id ": { " customerId ": 123," day ": ISODate (" 2012-06-20: 00: 00 : 00Z ")}, " godziny ": [{" godzina ": ISODate (" 2012-06-20: 01: 00: 00Z ")," pingi ": 2," linki ": 3}]}' Po z powyższym zapytaniem dotyczącym agregacji, muszę scalić/upsert to do tej kolekcji, aby przechowywać zagregowane dane. Jak mogę to osiągnąć? Dzięki – user3756522
@ user3756522 To naprawdę brzmi jak inne pytanie i jest najlepiej zadawane jako nowy post, w którym wyjaśnisz swój zamiar właściwie, a nie w komentarzach. Kwerenda pokazana w odpowiedzi będzie agregować według każdego dnia i każdej godziny dla zakresu, który wysłałeś. Również twój '$ match' dla tego powinien zawsze być ** pierwszym ** etapem potoku. Z MongoDB 2.6 Twoje dane wyjściowe mogą być kursorem, który możesz iterować w celu przetworzenia wyników –