You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:31:07