Nå, du kan ikke bare "sminke". operatorer som $mode
er ikke en aggregeringsoperatør, og de eneste ting, du kan bruge, er dem, der faktisk eksisterer
.
Så for at returnere kategoriværdien inden for den grupperede tidsperiode, der forekommer mest, er det nødvendigt at gruppere først på hver af disse værdier og returnere antallet af forekomster. Derefter kan du sortere disse resultater efter det antal og returnere den kategoriværdi, der registrerede det højeste antal inden for denne periode:
// Filter dates
{ "$match": {
"dt": {
"$gt": new Date("October 13, 2010 12:00:00"),
"$lt": new Date("November 13, 2010 12:00:00")
}
}},
// Group by hour and category, with avg and count
{ "$group": {
"_id": {
"dt": {
"$add": [
{
"$subtract": [
{ "$subtract": ["$dt", new Date(0)] },
{
"$mod": [
{ "$subtract": ["$dt", new Date(0)] },
3600000//1000 * 60 * 60
]
}
]
},
new Date(0)
]
},
"category": "$category"
},
"price": { "$avg": "$price" },
"count": { "$sum": 1 }
}},
// Sort on date and count
{ "$sort": { "_id.dt": 1, "count": -1 }},
// Group on just the date, keeping the avg and the first category
{ "$group": {
"_id": "$_id.dt",
"price": { "$avg": "$price"}
"category": { "$first": "$_id.category" }
}}
Så $group
på både dato og kategori og behold kategoriantallet via $sum
. Så skal du $sort
så den største "tælling" er øverst for hver grupperet dato. Og brug endelig $first
når du anvender en anden $group
som blot anvendes på selve datoen for at returnere den kategori med det største antal for hver dato.
Lad dig ikke friste af operatører som $max
da de ikke virker her. Den vigtigste forskel er den "bundne" relation til "posten/dokumentet" produceret for hver kategoriværdi. Det er altså ikke det maksimale "antal" du ønsker eller den maksimale "kategori"-værdi, men derimod den kategoriværdi, der "producerede" det største antal. Derfor er der en $sort
nødvendigt her.
Til sidst nogle vaner du "bør" bryde:
-
Brug ikke datoforekomstdata uden UTC-format som input, medmindre du virkelig ved, hvad du laver. Datoer vil altid blive konverteret til UTC, så i det mindste i testlister bør du vænne dig til at angive datoværdien på den måde.
-
Det ser måske lidt renere ud den anden vej, men ting som
1000 * 60 * 60
er meget mere beskrivende kode for, hvad den gør end3600000
. Samme værdi, men én form er vejledende for dets tidsenheder på et øjeblik. -
Sammensætning af
_id
når der kun er en enkelt værdi kan også forvirre problemer. Så der er ingen mening i at få adgang til_id.dt
hvis det var den eneste værdi til stede. Hvornår er mere end en enkelt egenskab inden for_id
så er det fint. Men enkelte værdier skal bare tildeles lige tilbage til_id
alene. Intet vundet ellers, og single er helt klart.