Не можете да използвате операторите за агрегиране на дати
върху всичко друго, което е Date
самия обект. Вашият най-добър вариант е да конвертирате тези „низове“ в правилни Date
обекти, за да можете да правите заявки правилно в тази и бъдещи операции.
Въпреки това, ако вашите „низове“ винаги имат обща структура, тогава има начин да направите това с рамка за агрегиране
инструменти. Това изисква много мисъл за манипулиране, което не го прави "оптимален" подход за справяне с проблема. Но със зададена структура от „двойни цифри“ и последователен разделител това е възможно с $substr
оператор:
db.collection.aggregate([
{ "$group": {
"_id": {
"year": { "$substr": [ "$dateStr", 7, 4 ] },
"month": { "$substr": [ "$dateStr", 4, 2 ] }
},
"count": { "$sum": 1 }
}}
])
Така че кастингът на JavaScript не работи в рамките на агрегацията. Винаги можете да „подавате“ вход към тръбопровода въз основа на оценка на „клиентски код“, но самият процес на агрегиране не оценява никакъв код. Точно като основната машина за заявки, всичко това се основава на внедряване на „структура на данни“, която използва инструкции на „родния оператор“, за да свърши работата.
Не можете да конвертирате низове в дати в конвейера за агрегиране. Трябва да работите с истински BSON Date
обекти, но можете да го направите с низове, ако има последователен формат, който можете да представите в "лексикален ред".
Все пак предлагам да ги конвертирате в BSON Dates
ВЪЗМОЖНО НАЙ-СКОРО. И внимавайте, че стойността "ISODate" или UTC е конструирана с различна форма на низ. т.е.:
new Date("2020-01-07")
Във формат "гггг-мм-дд". Поне за извикването на JavaScript.