mongodb按条件聚合分页
程序员文章站
2022-03-28 13:58:46
...
有一个需求,检索出给定起止日期内,每小时整点或接近整点的一条数据,求助老师无果,翻遍资料终得出以下方法:
cursor = mongo_client[project_code][collection_name].aggregate([
{"$match": {"datetime": {"$gte": start_time, "$lte": end_time}}},
{"$group": {"_id": {"month": {"$month": "$datetime"}, "day": {"$dayOfMonth": "$datetime"},
"hours": {"$hour": "$datetime"}},
"datetime_t": {"$first": "$datetime"},
"equip_info_t": {"$first": "$equip_info"}, }},
{"$project": {"datetime": {"$dateToString": {"format": "%Y-%m-%d %H:%M:%S", "date": "$datetime_t"}},
"_id": 0, }}, # "equip_data":"$equip_info_t"
{"$sort": {"datetime": 1}},
{'$facet': {"metadata": [{"$count": "total"}, {"$addFields": {"current_page": page}}],
"data": [{"$skip": (page - 1) * size}, {"$limit": size}]}}
])
解释:
- match,首先根据时间限定范围
- group,根据字段datetime(isoDate类型)获取月份,日分,小时,根据月日时组,如果起止日期超过一年,需提取年份。提取需要的信息供下一步选择。
- project,设置展示的数据,不要的数据设置为0,如果需要字符串类型的日期,需进一步转换。
- sort,对日期进行顺序排序,逆序设置为-1
- facet,设置多个输出管道,addFields添加新的字段,limit限制取多少