Монго агрегация Преобразование строки в дату в версии 3.4.7 - PullRequest
0 голосов
/ 05 июля 2018

У меня есть следующая функция агрегатора, которую я не запускаю напрямую в консоли Монго. Я передаю этот агрегатор в API в виде строки запроса. Я закодирую следующий агрегатор напрямую и передам запрос get в виде строки запроса.

[

      {
         "$limit": 500
      },

      {
            "$match": {
              "timestamp": {
                "$gte": {
                  "$dte": "2017-07-01"
                },
                "$lt": {
                  "$dte": "2020-12-31"
                }
              }
            }
      },      

      {
            "$group": {
                "_id": { "$year": "$timestamp" },
                "scores": { "$push": "$statement.result.score.scaled" },
                "duration_seconds": { "$push": "$statement.result.duration_seconds" }
             }
      },

      { 
            "$project": {
                 "scores": 1,
                 "duration_seconds": 1,
                 "statements_count": 1,
                 "semester": { 
                                "$cond": [  
                                            { 
                                                "$lte": [ 
                                                          {  
                                                            "$month": 
                                                                { 
                                                                  "$dateFromString": {
                                                                    "dateString": "$timestamp"
                                                                  }
                                                                }
                                                          }, 6
                                                        ] 
                                            }, "Jan", "July" 
                                         ]
                             }
            }  
      },

      {
            "$group": {
                "_id": { "semester": "$semester", "year": { "$year": "$timestamp" } },
                "avg_score": { "$avg": "$scores" },
                "avg_duration": { "$avg": "$duration_seconds" },
                "statements_count": { "$sum": 1 }
             }
      }
    ]

Здесь у меня есть документ выписки, он имеет timestamp, что является датой ISO, но в строковом формате. Я хочу сгруппировать выписки по семестрам (если месяц 1-6: Jan, 6-12: July)

Здесь проблема в том, что я использую mongo 3.4.7, а оператор "$dateFromString" работает только в версиях выше 3.6. Итак, я получаю ошибку.

  1. Так как я могу сгруппировать это по семестрам в версии Монго 3.4.7?

  2. При группировке по семестрам я сталкиваюсь со следующей проблемой.

    И моя агрегация не работает для группировки по семестрам. Потому что, как я могу сначала использовать группировку семестра и выполнить этап проекта? Групповой этап не поддерживает агрегатор $cond и т. Д., Который я могу использовать только на этапе project.

1 Ответ

0 голосов
/ 05 июля 2018

Вы можете попробовать $split оператор с $arrayElemAt для индекса 1, чтобы вернуть значение месяца.

{"semester":{
  "$cond":[
    {"$lte":[{"$arrayElemAt":[{"$split":["$timestamp","-"]},1]},"06"]},
    "Jan",
    "July"
  ]
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...