【发布时间】: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 以上版本。所以我得到了一个错误。
-
那么如何在 mongo 3.4.7 版本中按学期分组呢?
-
我在先按学期分组时遇到以下问题。
而且我的聚合不适用于按学期分组。因为我怎么能先用学期分组,做项目阶段呢? 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