Чтобы получить разницу, вы можете $ вычесть $ min end
значений и $ max start
значений из обоих наборов. Если два набора не перекрывают друг друга, вы получите отрицательное значение, поэтому вы можете использовать $ max еще раз для назначения 0
в таком случае. Попробуйте:
let startTimeParam = ISODate("2018-02-06 12:58:04.000");
let endTimeParam = ISODate("2018-02-06 15:59:04.000");
db.col.aggregate([
{
$project: {
seconds: {
$let: {
vars: {
totalMs: {
$max: [
0,
{ $subtract: [ { "$min": [ "$endTime", endTimeParam ] }, { $max: [ "$startTime", startTimeParam ] } ] }
]
}
},
in: {
$divide: [ "$$totalMs", 1000 ]
}
}
}
}
}
])
Использование $ let для определения временной переменной и $ Деление для преобразования мс в секунды.
MongoDB детская площадка
Ниже диаграмма иллюстрирует все возможные случаи на двух наборах. r представляет момент времени, который будет взят как правая сторона вычитания, в то время как l представляет левую сторону вычитания: