如何记录在 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 中创建动态模式