Mongo Aggregation在3.4.7版中将字符串转换为日期

时间:2018-07-05 09:55:26

标签: mongodb aggregation-framework

我具有以下聚合器功能,我没有直接在mongo控制台中触发。我将此聚合器作为查询字符串传递给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. 那么如何在mongo 3.4.7版本中按学期对此分组?

  2. 我先按学期分组时面临以下问题。

    我的汇总不适用于按学期分组。因为我该如何先使用学期分组,然后进行项目阶段?小组阶段不支持$cond阶段只能使用的project等聚合器。

1 个答案:

答案 0 :(得分:1)

您可以尝试将$split$arrayElemAt运算符用于索引1以返回月份值。

{"semester":{
  "$cond":[
    {"$lte":[{"$arrayElemAt":[{"$split":["$timestamp","-"]},1]},"06"]},
    "Jan",
    "July"
  ]
}}