Mongoose 模型将默认日期保存为上次启动服务器的日期

Mongoose model saves default date as that of last time the server was started at

提问人:ARHAM RUMI 提问时间:11/9/2023 最后编辑:ARHAM RUMI 更新时间:11/10/2023 访问量:63

问:

我有这个猫鼬模型

const reportUsSchema = new mongoose.Schema({
  texts: [
    {
      text: { type: String, default: "" },
      date_time: { type: Date, default: new Date() },
    },
  ],
});

我想要这个:

每当在字段中推送新文本时,我都想插入当前日期时间。texts

我得到了什么(问题):

我得到的日期时间与我上次重新启动服务器的时间相同。例如,如果我在 2 天前重新启动了服务器,我会在日期前 2 天收到,这是错误的。

我尝试过什么:

  1. 使用 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() }
  1. 使用内置的 Date()

我目前正在上面的代码中使用它,但以上都没有对我有用。

注意:起作用的是,我没有依赖于猫鼬模型中的这个默认值,而是将当前日期时间值与文本一起传递。这运作良好。

我无法理解这种行为。帮助我了解我错在哪里。

猫鼬版本:5.10.7

编辑

我知道事情。我想知道我做错了什么,猫鼬会这样。我想了解这种行为。new schema

节点 .js mongodb 日期时间 猫鼬 momentjs

评论


答:

2赞 Khải Hồ Quang 11/9/2023 #1

架构中的 default: new Date() 选项意味着date_time字段的默认值为创建文档或未指定字段时的当前日期和时间。

您可以使用时间戳选项:

let ItemSchema = new Schema({
  texts: [
    {
      text: { type: String, default: "" },
    },
  ],
},
{
  timestamps: true
});

您还可以指定时间戳文件:

timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }

评论

0赞 ARHAM RUMI 11/10/2023
我知道我能做到。谢谢你。但我想知道它为什么会这样?猫鼬架构是否依赖于服务器的上次重启?或者类似的东西?我想知道这个。你能帮我理解这一点吗?
0赞 jQueeny 11/10/2023 #2

根据您在此答案中的评论,您需要更新要使用的架构,而不是像这样:Date.nownew 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.nowDate.now()

评论

0赞 ARHAM RUMI 11/10/2023
我知道我能做到。谢谢你。但我想知道它为什么会这样?猫鼬架构是否依赖于服务器的上次重启?或者类似的东西?我想知道这个。你能帮我理解这一点吗?
0赞 jQueeny 11/10/2023
我添加了一个摘要。我希望这能消除任何歧义。
0赞 jQueeny 11/10/2023
@ARHAMRUMI添加了一个摘要,但我刚刚发现了这个问题,如果你需要的话,答案会更深入一些。