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 * 60er 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
_idnår der kun er en enkelt værdi kan også forvirre problemer. Så der er ingen mening i at få adgang til_id.dthvis det var den eneste værdi til stede. Hvornår er mere end en enkelt egenskab inden for_idså er det fint. Men enkelte værdier skal bare tildeles lige tilbage til_idalene. Intet vundet ellers, og single er helt klart.