【问题标题】:How can I record a timestamp of when a record is created in Mongoose schema?如何记录在 Mongoose 模式中创建记录的时间戳?
【发布时间】: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

【问题讨论】:

标签: javascript mongodb express date mongoose


【解决方案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。

      这里有两个想法:

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-07-06
        • 1970-01-01
        • 1970-01-01
        • 2016-12-19
        • 2016-09-09
        • 2018-03-24
        • 2019-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多