Nemůžete použít operátory agregace data
na cokoli jiného, co je Date
samotný objekt. Nejlepší možností je převést tyto „řetězce“ na správné Date
objektů, abyste mohli správně dotazovat v této i budoucích operacích.
To znamená, že pokud vaše „řetězce“ mají vždy společnou strukturu, existuje způsob, jak to udělat pomocí rámec agregace
nástroje. Vyžaduje to hodně manipulačního myšlení, které z toho nedělá „optimální“ přístup k řešení problému. Ale s nastavenou strukturou "dvojitých číslic" a konzistentním oddělovačem je to možné pomocí $substr
operátor:
db.collection.aggregate([
{ "$group": {
"_id": {
"year": { "$substr": [ "$dateStr", 7, 4 ] },
"month": { "$substr": [ "$dateStr", 4, 2 ] }
},
"count": { "$sum": 1 }
}}
])
Odesílání JavaScriptu tedy v rámci agregace nefunguje. Vždy můžete „vložit“ vstup do kanálu na základě vyhodnocení „klientského kódu“, ale samotný proces agregace žádný kód nevyhodnocuje. Stejně jako základní dotazovací stroj je vše založeno na implementaci „datové struktury“, která k provedení práce používá pokyny „nativního operátora“.
Řetězce nelze převést na data v agregačním kanálu. Měli byste pracovat se skutečným BSON Date
objektů, ale můžete to udělat pomocí řetězců, pokud existuje konzistentní formát, který můžete prezentovat v "lexikálním pořadí".
Stále doporučuji, abyste je převedli na BSON Dates
CO NEJDŘÍVE. A mějte na paměti, že hodnota "ISODate" nebo UTC je vytvořena v jiném tvaru řetězce. tj.:
new Date("2020-01-07")
Ve formátu „rrrr-mm-dd“. Alespoň pro vyvolání JavaScriptu.