所以我有一个包含时间戳以及其他数据的文档。
我基本上需要获取$ 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)])}
]