【问题标题】:Mongo aggregation Convert string to date in version 3.4.7Mongodb 聚合在 3.4.7 版本中将字符串转换为日期
【发布时间】:2018-12-13 18:15:27
【问题描述】:

我有以下聚合器功能,我没有直接在 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. 我在先按学期分组时遇到以下问题。

    而且我的聚合不适用于按学期分组。因为我怎么能先用学期分组,做项目阶段呢? Group Stage 不支持 $cond 等聚合器,我只能在 project 阶段使用。

【问题讨论】:

  • 3个选项中哪一个适合你:升级;用适当的日期更新所有文件;运行 map-reduce?
  • 我无法升级,服务器在 3.4 上运行。更新所有文档非常困难,因为我使用字符串格式从其他数据库迁移了很多数据(我喜欢:"timestamp" : "2017-03-25T05:43:12.792301Z",)映射 - 减少我无法使用,因为除了聚合之外我没有任何接口
  • 我们可以在 mongo 聚合中使用 map - reduce 吗?
  • 那么你不能使用日期时间函数,必须处理字符串——解析、提取等。
  • 你能帮忙解决这个问题吗? stackoverflow.com/questions/61165765/…

标签: mongodb aggregation-framework


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答,但聚合不起作用,因为您能告诉我如何先按学期进行分组吗?我更新了我的答案。
  • 不客气。试试{$group:{_id:{"semester":{ "$cond":[ {"$lte":[{"$arrayElemAt":[{"$split":["$timestamp","-"]},1]},"06"]}, "Jan", "July" ] }}}}
  • 我得到了:$split requires an expression that evaluates to a string as a first argument, found: date,我认为它只是作为日期来的!但我得到的是一个字符串。所以我会尝试将其转换为字符串并尝试。
  • 最后我让它与$month 一起工作,因为它在group -> _id 内部工作,它在_id 之外的小组赛阶段对我不起作用。无论如何,这就是提示,我接受答案。
  • 您能帮忙解决这个问题吗? stackoverflow.com/questions/61165765/…
猜你喜欢
  • 2019-11-29
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多