如何安排猫鼬某个地方的营业时间?

Posted

技术标签:

【中文标题】如何安排猫鼬某个地方的营业时间?【英文标题】:How can I structure the opening hours of some place in Mongoose? 【发布时间】:2019-11-16 11:01:33 【问题描述】:

我需要为我的数据库设计一种方法,以便能够存储一个地方的不同营业时间,比如酒吧或餐厅。这些开放时间可能每天都不同,它们需要使用 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,
        ,
    ,

很遗憾,我找不到更好的方法。您认为该问题的最佳模式是什么?

【问题讨论】:

【参考方案1】:

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

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

periods 是一个数组的原因是你可以有这样的

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

希望这是有道理的......

【讨论】:

嗨,我正在尝试实现这一点,但不确定如何输入周一至周日的日期【参考方案2】:
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

【讨论】:

【参考方案3】:

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

如果我正在设计这个,我不会使用属性名称的缩写。例如,我使用完整的“星期四”,然后在对象本身中使用 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 转换。

当然,这一切都取决于您的数据的实际用例。

【讨论】:

存储 unix 纪元时间是个好主意。我还考虑将营业时间存储为一个由 4 位数字组成的字符串(由正则表达式或类似的东西验证),因此我们将拥有 start: 0800, end: 1900 例如,然后使用 moment.js 对其进行操作。这也行吗? @Anthony timeAsString 实际上也不错。我正在考虑出于显示目的,但每次更新开始和结束时间时,您可能不得不跳过一些环节。但我想你有一个 updateTime() 函数,它需要几小时和几分钟才能为你做所有的魔法,所以我想这没什么大不了的。在这种情况下,肯定会节省一些时间来存储为字符串以供显示。不确定我是否喜欢在 moment.js 中使用它进行实际时间操作的音频,我宁愿用数字保持数学,并用字符串显示。

以上是关于如何安排猫鼬某个地方的营业时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何找到调用某个函数的地方?

K-Means 聚类算法

使用猫鼬处理并发修改

使用猫鼬处理并发修改

线程中断后如何确保通过某个地方?

如何填充一组子`ref`ed文档猫鼬?