Я бы посоветовал вам хранить значения временных меток для всех, это наиболее универсальное решение, а также простое управление для запросов такого типа
Так что ваша схема будет выглядеть как
{
time:{
type: Number,
default: 0
},
history:{
created_at:{
type: Number,
default: 0
},
accepted_at:{
type: Number,
default: 0
},
completed_at:{
type: Number,
default: 0
}
}
}
А затем напишите ваш запрос следующим образом:
db.collection.aggregate([
{
$addFields: {
"end_deadline": {
$add: [
"$history.created_at",
{
$multiply: [
"$time",
3600000
]
}
]
},
}
},
{
$match: {
"history.accepted_at": {
$exists: true
},
"history.completed_at": null,
$expr: {
$gte: [
ISODate("2020-01-23T00:00:00.441Z"),
"$end_deadline"
]
}
}
}
])
Пример данных
[
{
"time": 12,
"start_from": 1579910400441,
"history": {
"created_at": 1579737600441,
"accepted_at": 1579741200441
}
},
{
"time": 24,
"start_from": 1579932000441,
"history": {
"created_at": 1579737600441,
"accepted_at": 1579739400441,
"completed_at": 1579935600441
}
},
{
"time": 24,
"start_from": 1578700800441,
"history": {
"created_at": 1578528000441,
"accepted_at": 1578614400441
}
}
]
Пример ответа
[
{
"_id": ObjectId("5a934e000102030405000000"),
"end_deadline": 1.579780800441e+12,
"history": {
"accepted_at": 1.579741200441e+12,
"created_at": 1.579737600441e+12
},
"start_from": 1.579910400441e+12,
"time": 12
},
{
"_id": ObjectId("5a934e000102030405000002"),
"end_deadline": 1.578614400441e+12,
"history": {
"accepted_at": 1.578614400441e+12,
"created_at": 1.578528000441e+12
},
"start_from": 1.578700800441e+12,
"time": 24
}
]