142 lines
4.6 KiB
JavaScript
142 lines
4.6 KiB
JavaScript
/* global use, db */
|
|
// MongoDB Playground
|
|
// To disable this template go to Settings | MongoDB | Use Default Template For Playground.
|
|
// Make sure you are connected to enable completions and to be able to run a playground.
|
|
// Use Ctrl+Space inside a snippet or a string literal to trigger completions.
|
|
// The result of the last command run in a playground is shown on the results panel.
|
|
// By default the first 20 documents will be returned with a cursor.
|
|
// Use 'console.log()' to print to the debug output.
|
|
// For more documentation on playgrounds please refer to
|
|
// https://www.mongodb.com/docs/mongodb-vscode/playgrounds/
|
|
use("statistics");
|
|
|
|
let formattedDate = (date) => ({
|
|
unix: { $toLong: date },
|
|
iso: { $toString: date },
|
|
});
|
|
|
|
db.getCollection("peertube_ts").aggregate([
|
|
{
|
|
$sort: { timestamp: 1 }
|
|
},
|
|
{
|
|
$group: {
|
|
_id: "$tags.session",
|
|
host: { $first: "$tags.host" },
|
|
firstTimestamp: { $first: "$timestamp" },
|
|
lastTimestamp: { $last: "$timestamp" },
|
|
firstTimestampWithPeers: {
|
|
$min: {
|
|
$cond: {
|
|
if: { $gt: [{ $size: { $ifNull: ["$peers", []] } }, 0] },
|
|
then: "$timestamp",
|
|
else: null,
|
|
}
|
|
}
|
|
},
|
|
maxNumberOfPeers: {
|
|
$max: {
|
|
$size: { $ifNull: ["$peers", []] },
|
|
}
|
|
},
|
|
minNumberOfPeers: {
|
|
$min: {
|
|
$size: { $ifNull: ["$peers", []] },
|
|
}
|
|
}
|
|
}
|
|
},
|
|
// Lookup other sessions that may have peers
|
|
{
|
|
$lookup: {
|
|
from: "peertube_ts",
|
|
let: { currentSession: "$_id", ftp: "$firstTimestampWithPeers", fst: "$firstTimestamp" },
|
|
pipeline: [
|
|
{
|
|
$match: {
|
|
$expr: {
|
|
$and: [
|
|
{ $ne: ["$tags.session", "$$currentSession"] },
|
|
{ $lt: ["$timestamp", "$$ftp"] },
|
|
{ $gte: ["$timestamp", "$$fst"] },
|
|
{ $gt: [{ $size: { $ifNull: ["$peers", []] } }, 0] }
|
|
]
|
|
}
|
|
}
|
|
}
|
|
],
|
|
as: "concurrentSessions"
|
|
}
|
|
},
|
|
// Mark whether peers existed in other sessions before starting
|
|
{
|
|
$addFields: {
|
|
concurrentSessions: {
|
|
$gt: [{ $size: "$concurrentSessions" }, 0]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
$group: {
|
|
_id: "$host",
|
|
sessions: {
|
|
$push: {
|
|
id: "$_id",
|
|
startTime: formattedDate("$firstTimestamp"),
|
|
endTime: formattedDate("$lastTimestamp"),
|
|
duration: {
|
|
$divide: [
|
|
{
|
|
$subtract: ["$lastTimestamp", "$firstTimestamp"],
|
|
},
|
|
1000,
|
|
]
|
|
},
|
|
firstPeerConnection: {
|
|
$cond: {
|
|
if: { $eq: ["$firstTimestampWithPeers", null] },
|
|
then: null,
|
|
else: {
|
|
time: {
|
|
date: formattedDate("$firstTimestampWithPeers"),
|
|
elapsedFromStart: {
|
|
$divide: [
|
|
{
|
|
$subtract: ["$firstTimestampWithPeers", "$firstTimestamp"],
|
|
},
|
|
1000,
|
|
]
|
|
}
|
|
},
|
|
concurrentSessions: "$concurrentSessions",
|
|
}
|
|
}
|
|
},
|
|
maxPeers: { $max: "$maxNumberOfPeers" },
|
|
minPeers: { $min: "$minNumberOfPeers" }
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
$set: {
|
|
sessions: {
|
|
$sortArray: {
|
|
input: "$sessions",
|
|
sortBy: { id: 1 }
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
$project: {
|
|
_id: 0,
|
|
host: "$_id",
|
|
sessions: "$sessions"
|
|
}
|
|
},
|
|
{
|
|
$sort: { host: 1 }
|
|
}
|
|
]);
|