MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDb Como agrupar por mês e ano da string


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.