У меня есть объект рабочих часов в схеме мангуста, который представляет дату. Я передаю объект json и извлекаю его для анализа в Date как строку. Интересно, можете ли вы или будет лучше представить его как другой тип объекта. Ошибка, которую я получаю при передаче следующим образом: проверка не удалась: business.businessHours.monday.startTime: не удалось преобразовать дату для значения «08:00» (строка типа)
Обходным решением будут сеттеры, которые добавят текущую дату с часами и минутами:
date.setHours(08);
date.setMinutes(30);
Я чувствую, что есть лучший способ сделать это. Есть ли способ передать объект даты в json?
мой json:
{
...,
"businessHours":{
"monday": {
"startTime": "08:00",
"endTime": "18:30"
},
"tuesday": {
"startTime": "08:00",
"endTime": "18:30"
},
"wednesday": {
"startTime": "08:00",
"endTime": "18:30"
},
"thursday": {
"startTime": "08:00",
"endTime": "18:30"
},
"friday": {
"startTime": "08:00",
"endTime": "18:30"
},
"saturday": {
"startTime": null,
"endTime": null
},
"sunday": {
"startTime": null,
"endTime": null
}
}
}
Схема выглядит так:
const sellerSchema = new mongoose.Schema({
user: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
unique: true,
},
...,
business: {
businessHours: {
monday: {
startTime: {
type: Date,
},
endTime: {
type: Date,
},
},
tuesday: {
startTime: {
type: Date,
},
endTime: {
type: Date,
},
},
wednesday: {
startTime: {
type: Date,
},
endTime: {
type: Date,
},
},
thursday: {
startTime: {
type: Date,
},
endTime: {
type: Date,
},
},
friday: {
startTime: {
type: Date,
},
endTime: {
type: Date,
},
},
saturday: {
startTime: {
type: Date,
},
endTime: {
type: Date,
},
},
sunday: {
startTime: {
type: Date,
},
endTime: {
type: Date,
},
},
},
}
Я знаю, что могу преобразовать его, прежде чем сохранить, но есть ли способ проанализировать строку только с датой в формате чч: мм? Я не могу найти способ, или было бы лучше просто представить его как другой объект и какой объект был бы идеальным для этого случая.
или у меня должна быть схема вроде:
Мне нужны часы и минуты для будущей логики.
const sellerSchema = new mongoose.Schema({
...,
business: {
businessHours: {
monday: {
startTime: Number, //which will be represented as HHMM
endTime: Number, //which will be represented as HHMM
},
},
},
});
Спасибо
Все, что я хочу сэкономить, это часы и минуты для представления рабочих часов. Я подумываю изменить свою схему, чтобы она содержала число, которое будет представлено в виде ЧЧММ, например, 0830, что будет 08:30. Чтобы убедиться, что бронирование не менее 8:30 утра. Просто не уверен, что это будет идеально или даже строка для "08:30"
Строка будет работать, но, возможно, будет неудобна для других операций. Просто выберите день, любой день, чтобы сохранить как часть даты
Не имеет большого значения, используете ли вы такие значения, как "18:30"
или 1830
. Один такой же плохой, как и другой.
Такие значения, как "18:30"
, являются строками, их нельзя преобразовать в Date
. Если вам нравится это делать, у вас должна быть полная строка даты/времени, например. "2022-05-06T18:30:00". Однако вы должны никогда хранить значения даты в виде строки, это недостаток дизайна. Храните всегда правильные Date
объекты!
Использование названий дней недели также является плохой идеей, MongoDB изначально не поддерживает (локализованные) названия дней недели. Кроме того, использование динамических имен полей — плохой дизайн.
Я бы предложил этот:
{
businessHours: [
{ dayOfWeek: 1, startHour: 8, startMinute: 0, endHour: 18, endMinute: 30 },
{ dayOfWeek: 2, startHour: 8, startMinute: 0, endHour: 18, endMinute: 30 },
...
{ dayOfWeek: 5, startHour: 8, startMinute: 0, endHour: 18, endMinute: 30 }
]
}
Согласно ISO-8601 неделя начинается в понедельник, поэтому dayOfWeek: 1
означает понедельник.
Затем вы можете легко создавать из него значения Date
, например, так:
{
$dateFromParts : {
'isoWeekYear': {$isoWeekYear: "$$NOW"},
'isoWeek': {$isoWeek: "$$NOW"},
'isoDayOfWeek': "$dayOfWeek",
'hour': "$startHour",
'minute': "$startMinute"
}
}
Если вы используете названия дней недели, вам придется иметь дело с $ переключатель или вам понадобится сторонняя библиотека, такая как момент.js, Луксон или Day.js.