如何记录在 Mongoose 模式中创建记录的时间戳?

Posted

技术标签:

【中文标题】如何记录在 Mongoose 模式中创建记录的时间戳?【英文标题】:How can I record a timestamp of when a record is created in Mongoose schema? 【发布时间】:2022-01-14 15:40:03 【问题描述】:

我正在构建一个允许用户在网页上输入记录的应用程序。我想显示提交每条记录的日期/时间,我尝试了几种不同的方法,最后以我想要的格式显示日期/时间,但似乎时间戳是在服务器时记录的启动而不是在添加记录时启动。我正在使用 moment.js 进行格式化

这是我的架构

const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const moment = require("moment");
var d = new Date();
var formattedDate = moment(d).format("MM-DD-YYYY, h:mm:ss a");
let codeSchema = new Schema(
    code: 
      type: String
    ,
    createdAt: 
      type: String,
      default: formattedDate
    ,
  ,
  
    collection: "codes"
  
);
module.exports = mongoose.model("Code", codeSchema);

这是记录的外观,除了日期和时间是我启动服务器的时间而不是实际添加文档的时间

123456789789 12-09-2021, 12:59:33 pm

【问题讨论】:

这能回答你的问题吗? Which SchemaType in Mongoose is Best for Timestamp? 【参考方案1】:

您正在分配一个预定义的值,这就是它不起作用的原因,您应该创建一个函数并将该函数分配为默认值以获取文档时的值。

const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const moment = require("moment");

var createdAt = function()
    var d = new Date();
    var formattedDate = moment(d).format("MM-DD-YYYY, h:mm:ss a");
    return formattedDate;
;

let codeSchema = new Schema(
    code: 
      type: String
    ,
    createdAt: 
      type: String,
      default: createdAt
    ,
  ,
  
    collection: "codes"
  
);
module.exports = mongoose.model("Code", codeSchema);

【讨论】:

【参考方案2】:

考虑何时评估和分配该变量;是在创建模式时,只发生一次。在任何情况下,您都应该在保存记录时指定该值,并像其他任何值一样指定该值。

但是,moongose 已经有一个选项,可以在创建和更新记录时为记录分配时间戳。在这里查看:https://mongoosejs.com/docs/guide.html#timestamps

您的代码应如下所示:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const codeSchema = new Schema(
    code: 
      type: String
    ,
    createdAt: 
      type: String,
      default: formattedDate
    ,
  ,
  
    collection: "codes",
    timestamps: true
  
);

module.exports = mongoose.model("Code", codeSchema);

关于格式,我强调建议在最后一点使用数据时注意这一点。

【讨论】:

【参考方案3】:

有趣的问题。我在应用程序中使用猫鼬并没有看到这个问题。请参阅下面的架构:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const schema = new Schema(
  createdBy: Object,
  created:  type: Date, default: Date.now ,
  matchName:  type: String, required: true ,
  matchType:  type: String, required: true ,
  matchActive:  type: Boolean, default: false ,
  matchPrivate:  type: Boolean, default: true ,
  matchTime:  type: String, required: true ,
  matchDate:  type: String, requried: true ,
  matchPassword: String,
  matchMembers: [],
  course: Object,
  subCourse: Object,
  par:  type: Number, required: true ,
  numberOfHoles:  type: Number, required: true ,
  frontBackNine:  type: String, required: true, default: null ,
  completed:  type: Boolean, default: false ,
  compeletedOn:  type: Date ,
  winner:  type: String ,
  startingHole:  type: Number, default: 1 ,
  scorecardSettings:  type: String, required: true ,
  tournamentGroups:  type: Array, default: [] ,
);

module.exports = mongoose.model("Matches", schema);

但是我没有使用 moment.js。

这里有两个想法:

    尝试删除moment.js代码的注释并使用:
Date.now

代替时刻格式化的日期。这只是为了查看是否是导致问题的原因,并且不会实际为您提供解决方案

    您是如何创建集合和文档的?您是在服务器启动时创建文档还是在用户上传文件时创建文档?

【讨论】:

以上是关于如何记录在 Mongoose 模式中创建记录的时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

使用 strict: true 在 Mongoose 中创建动态模式

无法在 access 2007 拆分表单中创建新记录

如何在 CloudKit 中创建记录作为孩子的记录列表?

如何在存储过程中创建记录和该记录的表?

如何阻止在 Mongoose 数组中创建重复项 | NodeJS 猫鼬

如何在 django 中创建用于删除记录的删除按钮