Dla wszystkich dat i godzin związanych z zapytaniem należy $projektować wartości z pola daty - instrukcja tutaj
W tym przypadku z pomocą przychodzą nam ramy agregacji — proszę zapoznać się z poniższymi podstawowymi zapytaniami, które mają dzienną i tygodniową agregację wagową, dzięki czemu można przekształcić to zapytanie na inne okresy lub użyć jednego zapytania na okres:
db.timing.aggregate([{
$project : {
year : {
$year : "$date"
},
month : {
$month : "$date"
},
week : {
$week : "$date"
},
day : {
$dayOfWeek : "$date"
},
_id : 1,
weight : 1
}
}, {
$group : {
_id : {
year : "$year",
month : "$month",
week : "$week",
day : "$day"
},
totalWeightDaily : {
$sum : "$weight"
}
}
},
{
$group : {
_id : {
year : "$_id.year",
month : "$_id.month",
week : "$_id.week"
},
totalWeightWeekly : {
$sum : "$totalWeightDaily"
},
totalWeightDay : {
$push : {
totalWeightDay : "$totalWeightDaily",
dayOfWeek : "$_id.day"
}
}
}
}, {
$match : {
"_id.month" : 3
}
}
])
Przykładowe wyniki za miesiąc 3 dla moich fikcyjnych danych są poniżej:
{
"_id" : {
"year" : 2016,
"month" : 3,
"week" : 10
},
"totalWeightWeekly" : 600,
"totalWeightDay" : [
{
"totalWeightDay" : 200,
"dayOfWeek" : 7
},
{
"totalWeightDay" : 400,
"dayOfWeek" : 6
}
]
}
{
"_id" : {
"year" : 2016,
"month" : 3,
"week" : 9
},
"totalWeightWeekly" : 1000,
"totalWeightDay" : [
{
"totalWeightDay" : 200,
"dayOfWeek" : 4
},
{
"totalWeightDay" : 600,
"dayOfWeek" : 3
},
{
"totalWeightDay" : 200,
"dayOfWeek" : 7
}
]
}
{
"_id" : {
"year" : 2016,
"month" : 3,
"week" : 12
},
"totalWeightWeekly" : 400,
"totalWeightDay" : [
{
"totalWeightDay" : 200,
"dayOfWeek" : 7
},
{
"totalWeightDay" : 200,
"dayOfWeek" : 2
}
]
}
{
"_id" : {
"year" : 2016,
"month" : 3,
"week" : 13
},
"totalWeightWeekly" : 200,
"totalWeightDay" : [
{
"totalWeightDay" : 200,
"dayOfWeek" : 3
}
]
}
i aby uformować kształt według potrzeb, możesz użyć fazy $projektu
{$project:{
_id:0,
"year" : "$_id.year", //this could be ommited but use $match to avoid sum of other years
"month" : "$_id.month", //this could be ommited but use $match to avoid sum of other months
"week" :"$_id.week",
totalWeightWeekly:1
}}
{
"totalWeightWeekly" : 600,
"year" : 2016,
"month" : 3,
"week" : 10
}
Wszelkie komentarze mile widziane!