No, nemůžete se jen "nalíčit". operátory jako $mode
není operátor agregace a jediné, co můžete použít, jsou ty, které skutečně existují
.
Aby se tedy vrátila hodnota kategorie v rámci seskupeného časového období, které se vyskytuje nejčastěji, je nutné seskupit nejprve každou z těchto hodnot a vrátit počet výskytů. Potom můžete tyto výsledky seřadit podle tohoto počtu a vrátit hodnotu kategorie, která zaznamenala nejvyšší počet v daném období:
// 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" }
}}
Takže $group
k datu i kategorii a zachovat počet kategorií prostřednictvím $sum
. Potom $sort
takže největší "počet" je nahoře pro každé seskupené datum. A nakonec použijte $first
když použijete další $group
který se použije na samotné datum, aby se vrátila kategorie s největším počtem pro každé datum.
Nenechte se zlákat operátory jako $max
protože tady nepracují. Klíčovým rozdílem je „vázaný“ vztah k „záznamu/dokumentu“ vytvořenému pro každou hodnotu kategorie. Nejde tedy o maximální „počet“, který chcete, ani o maximální hodnotu „kategorie“, ale místo toho o hodnotu kategorie, která „vytvořila“ největší počet. Proto existuje $sort
potřeba zde.
Konečně některé návyky, které byste „měli“ opustit:
-
Nepoužívejte jako vstup data instance data ve formátu UTC, pokud opravdu nevíte, co děláte. Data budou vždy převedena na UTC, takže alespoň v testovacích výpisech byste si měli zvyknout na zadávání hodnoty data tímto způsobem.
-
Na druhou stranu to může vypadat trochu čistěji, ale věci jako
1000 * 60 * 60
jsou mnohem popisnější kód toho, co dělá, než3600000
. Stejná hodnota, ale jedna forma na první pohled ukazuje jednotky času. -
Složení
_id
když existuje pouze jedna hodnota, může to také zmást. Nemá tedy smysl přistupovat k_id.dt
kdyby to byla jediná přítomná hodnota. When je více než jedna vlastnost v rámci_id
pak je to v pohodě. Ale jednotlivé hodnoty by měly být přiřazeny přímo zpět k_id
sám. Jinak nic nezískalo a singl je celkem jasný.