提问人:ARHAM RUMI 提问时间:11/9/2023 最后编辑:ARHAM RUMI 更新时间:11/10/2023 访问量:63
Mongoose 模型将默认日期保存为上次启动服务器的日期
Mongoose model saves default date as that of last time the server was started at
问:
我有这个猫鼬模型
const reportUsSchema = new mongoose.Schema({
texts: [
{
text: { type: String, default: "" },
date_time: { type: Date, default: new Date() },
},
],
});
我想要这个:
每当在字段中推送新文本时,我都想插入当前日期时间。texts
我得到了什么(问题):
我得到的日期时间与我上次重新启动服务器的时间相同。例如,如果我在 2 天前重新启动了服务器,我会在日期前 2 天收到,这是错误的。
我尝试过什么:
- 使用 moment.js:我也尝试了 moment.js 的多种组合。在此处添加它们:
date_time: { type: Date, default: moment() }
和
date_time: { type: Date, default: moment().format() }
和
date_time: { type: Date, default: moment().utc(true) }
和
date_time: { type: Date, default: moment().utc(true).format() }
- 使用内置的 Date()
我目前正在上面的代码中使用它,但以上都没有对我有用。
注意:起作用的是,我没有依赖于猫鼬模型中的这个默认值,而是将当前日期时间值与文本一起传递。这运作良好。
我无法理解这种行为。帮助我了解我错在哪里。
猫鼬版本:5.10.7
编辑
我知道事情。我想知道我做错了什么,猫鼬会这样。我想了解这种行为。new schema
答:
架构中的 default: new Date() 选项意味着date_time字段的默认值为创建文档或未指定字段时的当前日期和时间。
您可以使用时间戳选项:
let ItemSchema = new Schema({
texts: [
{
text: { type: String, default: "" },
},
],
},
{
timestamps: true
});
您还可以指定时间戳文件:
timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
评论
根据您在此答案中的评论,您需要更新要使用的架构,而不是像这样:Date.now
new Date()
const reportUsSchema = new mongoose.Schema({
texts: [
{
text: { type: String, default: "" },
date_time: { type: Date, default: Date.now }, //< This change
},
],
});
这是因为当您使用时,您是在告诉架构使用定义架构时的默认日期,而不是文档。因此,如果将应用部署到服务器,然后启动应用,则该架构中该字段的默认值将是应用启动的时间。default: new Date()
但是,如果您使用 then mongoose 知道在创建文档时将默认值设置为使用日期时间。Date.now
在猫鼬文档中,他们确实推荐了这个:在他们的厨房水槽示例中。他们还在默认函数示例中列出了它。updated: { type: Date, default: Date.now },
总之,当您使用时,您调用了该函数,因此请使用返回值。如果使用,则传递函数 (),因此在文档创建时调用它。new Date()
Date.now
Date.now()
评论