Mongodb将$ first $ last限制为60分钟?

时间:2019-03-01 12:46:45

标签: mongodb aggregation truncate facet

所以我有一个包含时间戳以及其他数据的文档。

我基本上需要获取$ first条目和最后$ entry之间的时间差。 但是,由于这种性质,当第一个条目和最后一个条目超过1小时时,它需要算作一个新的“会话”。 否则,我会得到时间戳记,时间戳记从开始到结束之间会持续多个小时。

这是我到目前为止所掌握的。

  pipeline = [
        {"$sort": {"time": -1}},
        {
            "$group": {"_id":
                       {
                           "mac": "$mac",
                           "day": {"$dayOfMonth": {"date": '$time', "timezone": 'UTC'}},
                                                              "minute": {
                                   "$subtract": [
                                       {"$minute": "$time"},
                                       {"$mod": [{"$minute": "$time"}, 60]}
                                   ]
                               }
                       },
                       "lastSeen": {"$first": "$time"},
                       "firstSeen": {"$last": "$time"},
                       }
        },

        {
            "$project":
            {
                "_id": 1,
                "lastSeen": 1,
                "firstSeen": 1,
                "minutes":
                {
                    "$trunc":
                    {
                        "$divide": [{"$subtract": ["$lastSeen", "$firstSeen"]}, 60000]
                    }
                },

            }
        },

        {
            "$facet": {
                "0-5": [
                    {"$match": {"minutes": {"$gte": 0, "$lte": 5}}},
                    {"$count": "total"},
                ],
                "5-10": [
                    {"$match": {"minutes": {"$gte": 5, "$lte": 10}}},
                    {"$count": "total"},
                ],
                "10-20": [
                    {"$match": {"minutes": {"$gte": 10, "$lte": 20}}},
                    {"$count": "total"},
                ],
                "20-25": [
                    {"$match": {"minutes": {"$gte": 20, "$lte": 25}}},
                    {"$count": "total"},
                ],
                "25+": [
                    {"$match": {"minutes": {"$gt": 25}}},
                    {"$count": "total"},
                ],
            }
        },
        {"$project": {
            "result": {"$objectToArray": "$$ROOT"}
        }
        },
        {
            "$unwind": "$result"
        },
        {
            "$unwind": "$result.v"
        },
        {
            "$project": {
                "timeframe": "$result.k",
                "count": "$result.v.total"
            }
        },

        # {"$sort": SON([("_id", -1)])}

    ]

0 个答案:

没有答案