Node.js开发中如何设计Mongoose字段存储用户每周工作日排班信息
horarios 字段设计方案
你当前定义的horarios字段为Date类型,只能存储单个时间点,不符合每周重复排班的存储需求,可根据业务场景选择以下两种实现方案:
场景1:仅需存储每周可上班的工作日,无需记录上下班具体时间
适合仅需要标记用户每周哪几天上班的轻量场景,字段定义如下:
horarios: { type: [Number], // 数组元素对应星期:0=周日,1=周一,2=周二,...,6=周六 required: false, default: [], // 默认无排班 enum: [0, 1, 2, 3, 4, 5, 6], // 限制值只能是0-6的合法星期值 select: true }
使用示例:
- 用户选择周一到周五上班,存储值为
[1,2,3,4,5] - 查询所有周三上班的用户,直接执行
User.find({ horarios: 3 })即可
场景2:需要存储每个工作日的上下班具体时间(通用排班场景)
适合需要记录每天上下班时段的业务,先定义单日排班子Schema,再关联到用户主Schema:
// 单日排班规则子Schema const DailyScheduleSchema = new mongoose.Schema({ weekDay: { type: Number, required: true, enum: [0, 1, 2, 3, 4, 5, 6] // 0=周日,1=周一...6=周六 }, startTime: { type: String, // 存储格式为"HH:mm",例:"09:00" required: true }, endTime: { type: String, // 存储格式为"HH:mm",例:"18:00" required: true }, isOff: { type: Boolean, // 可选扩展字段,标记该天是否调休 default: false } }) // 替换原有horarios字段定义 horarios: { type: [DailyScheduleSchema], required: false, default: [], select: true }
使用优势:
- 支持灵活配置不同工作日的不同上下班时段,比如周一上9:00-18:00、周三上10:00-19:00都可单独存储
- 支持多条件查询排班:例查询所有周一早上9点上班的用户,执行
User.find({ "horarios.weekDay": 1, "horarios.startTime": "09:00" })即可 - 可扩展性强,后续如果需要支持多周不同排班,只需在子Schema新增
weekStartDate字段标记生效周即可
内容的提问来源于stack exchange,提问作者Paulo Avila
相关产品推荐
相关产品推荐

