如何在Mongoose Schema中存储用户输入时间?医药提醒APP开发
解决方案:在MongoDB中存储医药提醒时间
当然可以在MongoDB中存储用户输入的提醒时间,虽然MongoDB没有专门的「仅时间」存储类型,但有几种实用方案可以实现需求,同时修正你Schema里的错误:
问题说明
你用到的TimeRanges是浏览器端的API对象,Node.js/Mongoose环境中没有这个类型,所以会报「未定义」的错误,不能用它来定义Schema字段。
可行方案
1. 使用Date类型存储(推荐)
MongoDB的Date类型本质是UTC时间戳,我们可以用它存储带固定日期的时间(比如1970-01-01T08:30:00.000Z),只关注其中的时分秒部分。这种方式便于后续做时间比较、计算下一次提醒时间等操作。
修正后的Schema:
const mongoose = require('mongoose') const Schema = mongoose.Schema const medicineSchema = new Schema({ title: { type: String, required: true }, count: { type: Number, required: true }, about: { type: String }, time: { type: Date, required: true, // 可选:添加验证确保时间是当天的有效时分 validate: { validator: function(v) { const date = new Date(v); // 检查是否为有效时间,且日期部分为固定值(比如1970-01-01) return !isNaN(date.getTime()) && date.getUTCFullYear() === 1970 && date.getUTCMonth() === 0 && date.getUTCDate() === 1; }, message: props => `${props.value} 不是有效的提醒时间格式!` } } }, { timestamps: true }) module.exports = mongoose.model('Medicine', medicineSchema)
处理表单输入时,把用户选择的时分转换成Date对象:
// 假设表单提交的time是"08:30"格式的字符串 const userTime = "08:30"; const [hours, minutes] = userTime.split(':').map(Number); const storedTime = new Date(Date.UTC(1970, 0, 1, hours, minutes)); // 把storedTime存入数据库
2. 存储为HH:mm格式的字符串
如果只需要展示时间,不需要做复杂的时间计算,直接存储字符串最直观。可以通过正则验证确保格式正确:
Schema示例:
const medicineSchema = new Schema({ // ...其他字段 time: { type: String, required: true, match: /^([01]\d|2[0-3]):([0-5]\d)$/, // 验证HH:mm格式 message: props => `${props.value} 不是有效的HH:mm格式时间!` } }, { timestamps: true })
3. 存储为一天中的分钟数(数字类型)
把时间转换成从0点开始的分钟数(比如08:30就是8*60+30=510),这种方式做时间排序、计算间隔非常高效:
Schema示例:
const medicineSchema = new Schema({ // ...其他字段 time: { type: Number, required: true, min: 0, // 0点0分 max: 1439, // 23点59分 message: props => `${props.value} 不是有效的分钟数范围(0-1439)!` } }, { timestamps: true })
处理表单输入时转换:
const userTime = "08:30"; const [hours, minutes] = userTime.split(':').map(Number); const storedMinutes = hours * 60 + minutes;
内容的提问来源于stack exchange,提问作者Mohammed Zaid
相关产品推荐
相关产品推荐

