pymongo按时间聚合

2020/04/30 技术

pymongo按时间聚合

时间戳字段按小时聚合

对于 mongo 表中数据, 其中字段 update_time 为时间戳(float), 现在需要使用 pymongo 对该字段按小时进行聚合.

能找到最好的参考资料是这个: https://stackoverflow.com/questions/33078773/mongodb-aggregation-by-day-based-on-unix-timestamp

不同的 mongo server 版本, 能执行的语句会有差异. 碰到过两种情况, 现将使用到的代码例子记录如下.

版本 1, 使用 $substr 命令:

aggregate_list = [
    {"$project": {
        "hour": {"$substr": [{"$add": ["$update_time", 28800000]}, 0, 14]},
    }},
    {"$group": {"hour": "$hour", "count": {"$sum": 1}}},
    {"$sort": {"hour": 1}},
]

for doc in collection.aggregate(aggregate_list):
    print("{}:\t{}".format(doc["hour"], doc["count"]))

版本 2, 使用 $dateToString 命令

import arrow
aggregate_list = [
    {"$project": {
        "hour": {
                "$dateToString": {
                    "format": "%Y%m%d%H",
                    "date": {
                        "$add": [arrow.get(0).datetime, {"$multiply": [1000, "$update_time"]}, 8 * 3600 * 1000]
                    }
                }
            }
    }},
    {"$group": {"hour": "$hour", "count": {"$sum": 1}}},
    {"$sort": {"hour": 1}},
]
for doc in collection.aggregate(aggregate_list):
    print("{}:\t{}".format(doc["hour"], doc["count"]))

Search

    Table of Contents