Нет прямой функции, которая могла бы сделать это в MongoDB, вызвать проблему с вашей схемой. Как правило, вы можете сделать это: "availability_detail.daily_schedule.start_time": { $eq: "00:00" }
, но не это "availability_detail.daily_schedule.start_time": { $lte: "00:00" }
, чтобы можно было выполнить сравнение строк со строками "00:00" == "00:00"
или "00:00" !== "00:00"
, но когда дело касается операторов больше или меньше "00:00" >= "00:00"
или "00:00" =< "00:00"
, они плохо работают в базе данных, поэтому лучше всего сохранять их как документы типа Int в документах.
Поскольку вы уже сохранили данные в формате "00:00"
, вам необходимо преобразовать их в целые числа, например 0
, используя конвейер агрегации и сравнить с целочисленным вводом.
Запрос 1:
db.collection.aggregate([
{
$match: {
$or: [{"availability_detail.daily_schedule": {$exists: false}},
{
$expr: {
$lte: [
{$toInt:
{
$concat: [
{$substr: [ "$availability_detail.daily_schedule.start_time",0,2]},
{$substr: [ "$availability_detail.daily_schedule.start_time",3,4]}
]
}
},
0 /** Input 0 for "00:00" or 310 for "03:10" or 1830 for "18:30" */
]
}
}
]
}
}
])
Тест: mongoplayground
Запрос 2:
db.collection.aggregate([
{
$match: {
$or: [{"availability_detail.daily_schedule": {$exists: false}},
{
$expr: {
$lte: [
{
$toInt: {
$concat: [
{
$arrayElemAt: [{$split: ["$availability_detail.daily_schedule.start_time",":"]},0]
},
{
$arrayElemAt: [{$split: ["$availability_detail.daily_schedule.start_time",":"]},1]
}
]
}
},
0 /** Input 0 for "00:00" or 310 for "03:10" or 1830 for "18:30" */
]
}
}
]
}
}
])
Тест: mongoplayground