如何构造猫鼬某个地方的开放时间?

时间:2019-07-05 21:21:00

标签: mongodb mongoose database-design schema

我需要设计一种数据库存储方式,比如一个酒吧或一家餐馆。这些开放时间每天都有所不同,它们需要使用9:30或8:15等小时,而不仅仅是整数。

这是我想出的:

opening_hours: {
        normal_days: {
            mon: {
                start: { type: Number, min: 0, max: 23 },
                end: { type: Number, min: 0, max: 23 },
            },
            tue: {
                start: { type: Number, min: 0, max: 23 },
                end: { type: Number, min: 0, max: 23 },
            },
            wed: {
                start: { type: Number, min: 0, max: 23 },
                end: { type: Number, min: 0, max: 23 },
            },
            thu: {
                start: { type: Number, min: 0, max: 23 },
                end: { type: Number, min: 0, max: 23 },
            },
            fri: {
                start: { type: Number, min: 0, max: 23 },
                end: { type: Number, min: 0, max: 23 },
            },
            sat: {
                start: { type: Number, min: 0, max: 23 },
                end: { type: Number, min: 0, max: 23 },
            },
            sun: {
                start: { type: Number, min: 0, max: 23 },
                end: { type: Number, min: 0, max: 23 },
            },
        },
        special_days: {
            date: Date,
            name: String,
            start: { type: Number, min: 0, max: 23 },
            end: { type: Number, min: 0, max: 23 },
            is_closed: Boolean,
        },
    },

不幸的是,我找不到更好的方法。您认为该问题的最佳方案是什么?

3 个答案:

答案 0 :(得分:0)

我认为这没有太多问题(除了它不包括23:00-24:00),就是这样:

如果我正在设计此属性,则不会在属性名称中使用缩写。例如,Id使用完整的“星期四”,然后在对象本身中输入类似shorthand : 'THU'的内容。我也避免在任何地方都将小时数设为0-23。可能类似

{ 
...
shorthand: "THU"
startHours: 0-23,
endHours: 0-23,
startMinutes: 0-59,
endMinutes: 0-59,
startInMilliseconds: 0 - 24 * 60 * 60 * 1000 - 1,
endInMilliseconds: 0 - 24 * 60 * 60 * 1000 - 1
}

这将允许您跨时区和类似的时间工作,因为您可以轻松地操纵Unix纪元时间。将时间分成几个小时和几分钟,可以让您到达23:59,加上格式只是${thursday.startHours}:${thursday.startMinutes},而不是从23.75-> 23:45进行转换的一些怪异数学。

当然,这全部取决于您数据的实际用例。

答案 1 :(得分:0)

opening_hours: {
    normal_days: {
        monday: {
            start: { type: Date, default: new Date().setHours(8, 0, 0, 0) },
            end: { type: Date, default: new Date().setHours(4, 30, 0, 0) },
        },
        tuesday: {
            start: { type: Date, },
            end: { type: Date, },
        },
    }
}

查询数据库时,您可以分别获取小时或分钟的组成部分。日期对象存储日期,时间和时区。大多数编程语言都具有从Date对象解析小时,分钟和时区的功能。 MongoDB具有$ hour,$ minute和$ dayOfWeek运算符。

MongoDB Date Operators

Javascript Get Date Methods

答案 2 :(得分:0)

我曾经遇到过同样的问题,这就是我的实现方式:

opening_hours: [{
 day: {type Date}, //mon - sun
 periods: [{
   start: {type Date},
   end: {type Date}
   }]
 }]

periods是数组的原因是您可能会喜欢

[
 { 
   start: 9h00,
   end: 11h00
 },
 { 
   start: 13h00,
   end: 18h00
 }
]

希望如此...