欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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}]}}

    ])

解释:

  1. match,首先根据时间限定范围
  2. group,根据字段datetime(isoDate类型)获取月份,日分,小时,根据月日时组,如果起止日期超过一年,需提取年份。提取需要的信息供下一步选择。
  3. project,设置展示的数据,不要的数据设置为0,如果需要字符串类型的日期,需进一步转换。
  4. sort,对日期进行顺序排序,逆序设置为-1
  5. facet,设置多个输出管道,countcount统计数量,addFields添加新的字段,skipskip跳过多少,limit限制取多少
  6. mongodb按条件聚合分页
相关标签: mongodb