Итак, у меня есть документ, содержащий временные метки и некоторые другие данные.
Мне нужно получить разницу во времени между первой записью в $ и последней записью в $.Однако из-за природы этого, когда первая и последняя запись идут более 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)])}
]