我在mongoose模式中有一个代表日期的business hours对象.我正在传递一个json对象,并检索到要解析为字符串的对象.我想知道你是否可以,或者将它表示为另一种类型的对象是否更好.当我像这样传球时,我得到的错误是:validation failed: business.businessHours.monday.startTime: Cast to date failed for value "08:00" (type string)

一种解决方法是设置器,将当前日期与小时和分钟相加:

date.setHours(08);
date.setMinutes(30);

我觉得有更好的方法.

我的目标是:

{
  ...,
  "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,
      },
    },
  },
}

我知道我可以在保存之前转换它,但是有没有办法解析一个到目前为止只有hh:mm的字符串?我似乎找不到一个方法,或者把它作为一个不同的对象来表达会更好,什么样的对象才是这个场合的理想对象.

或者我应该有一个这样的模式:

我需要时间和分钟来做future 的逻辑.

const sellerSchema = new mongoose.Schema({
  ...,
  business: {
    businessHours: {
      monday: {
        startTime: Number, //which will be represented as HHMM
        endTime: Number, //which will be represented as HHMM
      },
    },
  },
});

非常感谢.

推荐答案

使用"18:30"1830这样的值没有太大区别.一个和另一个一样坏.

"18:30"这样的值是字符串,不能将它们转换为Date.如果你想这样做,那么你必须有一个完整的日期/时间字符串,例如"2022-05-06T18:30:00".然而,您应该never将日期值存储为字符串,这是一个设计缺陷.永远储存正确的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"       
    }
}

如果使用工作日名称,则必须处理$switch个,或者需要第三方库,如moment.jsluxonDay.js.

Javascript相关问答推荐

一次仅播放一个音频

Vega中的模运算符

Spring boot JSON解析错误:意外字符错误

空的结果抓取网站与Fetch和Cheerio

屏幕右侧屏障上的产卵点""

如何在JavaScript文件中使用Json文件

Html文件和客户端存储的相关问题,有没有可能?

如何修复我的数据表,以使stateSave正常工作?

try 使用javascript隐藏下拉 Select

查询参数未在我的Next.js应用路由接口中定义

使用getBorbingClientRect()更改绝对元素位置

使用带有HostBinding的Angular 信号来更新样式?

如何将zoom 变换应用到我的d3力有向图?

Reaction Redux&Quot;在派单错误中检测到状态Mutations

将基元传递给THEN处理程序

无法读取未定义的属性(正在读取合并)-react RTK

如何根据查询结果重新排列日期

React Refs不与高阶组件(HOC)中的动态生成组件一起工作

如果对象中的字段等于某个值,则从数组列表中删除对象

如何在Java脚本中添加一个可以在另一个面板中垂直调整大小的面板?