Você não pode usar os operadores de agregação de data em qualquer outra coisa que seja uma
Date
próprio objeto. Sua melhor opção é converter essas "strings" em Date
objetos para que você possa consultar corretamente nesta e em futuras operações. Dito isto, se suas "strings" sempre têm uma estrutura comum, existe uma maneira de fazer isso com o estrutura de agregação Ferramentas. Requer muito pensamento de manipulação que não torna esta uma abordagem "ótima" para lidar com o problema. Mas com uma estrutura definida de "dois dígitos" e um delimitador consistente, isso é possível com o
$substr
operador:db.collection.aggregate([
{ "$group": {
"_id": {
"year": { "$substr": [ "$dateStr", 7, 4 ] },
"month": { "$substr": [ "$dateStr", 4, 2 ] }
},
"count": { "$sum": 1 }
}}
])
Portanto, a conversão de JavaScript não funciona dentro da estrutura de agregação. Você sempre pode "alimentar" a entrada para o pipeline com base na avaliação do "código do cliente", mas o próprio processo de agregação não avalia nenhum código. Assim como o mecanismo de consulta básico, tudo isso é baseado em uma implementação de "estrutura de dados" que usa instruções de "operador nativo" para fazer o trabalho.
Você não pode converter strings em datas no pipeline de agregação. Você deve trabalhar com
BSON Date
real
objetos, mas você pode fazer isso com strings se houver um formato consistente que você possa apresentar em uma "ordem lexical". Ainda sugiro que você os converta em
BSON Dates
ASSIM QUE POSSÍVEL. E lembre-se de que o valor "ISODate" ou UTC é construído com um formato de string diferente. ou seja:new Date("2020-01-07")
Estar no formato "aaaa-mm-dd". Pelo menos para a invocação JavaScript.