给mongoose schemas添加created_at和updated_at字段
给mongoose schemas添加created_at和updated_at字段
有没有办法在mongoose模式中添加created_at
和updated_at
字段,而不必每次调用新MyModel()
时传递它们?
created_at
字段将是一个日期,仅在创建文档时添加。
updated_at
字段将在每次对文档调用save()
时更新为新日期。
我已经在我的架构中尝试了这个,但是除非我明确添加它,否则该字段不会显示出来:
var ItemSchema = new Schema({ name : { type: String, required: true, trim: true }, created_at : { type: Date, required: true, default: Date.now } });
从Mongoose 4.0开始,您现在可以在模式上设置时间戳选项,让Mongoose为您处理:
var thingSchema = new Schema({..}, { timestamps: true });
您可以像这样更改使用的字段名称:
var thingSchema = new Schema({..}, { timestamps: { createdAt: 'created_at' } });
更新: (5年后)
注意: 如果您决定使用Kappa Architecture(事件源 + CQRS),那么您根本不需要更新日期。因为您的数据是不可变的、只追加的事件日志,您只需要事件创建日期。类似于下面描述的Lambda架构。然后您的应用程序状态是事件日志(派生数据)的投影。如果您收到关于现有实体的后续事件,那么您将使用该事件的创建日期作为实体的更新日期。这是微服务系统中常用的(也常常被误解的)实践。
更新: (4年后)
如果您使用ObjectId
作为您的_id
字段(通常是这样的),那么您所需要做的就是:
let document = { updatedAt: new Date(), }
查看下面的原始答案,了解如何从_id
字段获取创建时间戳。如果需要使用来自外部系统的ID,则请查看Roman Rhrn Nesterov的答案。
更新: (2.5年后)
现在可以在mongoose版本 > = 4.0 中使用#timestamps选项。
let ItemSchema = new Schema({ name: { type: String, required: true, trim: true } }, { timestamps: true });
如果设置时间戳,mongoose将为模式分配createdAt
和updatedAt
字段,分配的类型为Date
。
您还可以指定时间戳字段的名称:
timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
注意: 如果您正在处理具有关键数据的大型应用程序,您应该重新考虑更新文档。我建议您使用不可变的、仅追加数据(lambda架构)。这意味着您只允许插入。不应允许更新和删除!如果您想"删除"一条记录,可以轻松地插入一个带有一些
timestamp
/version
字段的新文档,然后将deleted
字段设置为true
。同样,如果要更新文档——您需要创建一个带有适当字段更新和其余字段复制的新文档。然后,在查询此文档时,您将获取最新时间戳或未"删除"的最高版本(删除字段未定义或为false)的文档。如果您使用的是ObjectId作为标识字段,那么您不需要创建
created_at
字段。ObjectId具有一个名为getTimestamp()
的方法。ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp()这将返回以下输出:
ISODate("2012-10-15T21:26:17Z")更多信息请参见如何从Mongo ObjectID中提取创建日期
要添加
updated_at
字段,您需要使用以下内容:var ArticleSchema = new Schema({ updated_at: { type: Date } // rest of the fields go here }); ArticleSchema.pre('save', function(next) { this.updated_at = Date.now(); next(); });
数据不可变性确保您的数据是可调试的-您可以跟踪每个文档的历史。如果出现问题,您也可以回滚到文档的先前版本。如果您采用这样的架构,
ObjectId.getTimestamp()
是您所需要的,而且它不依赖于Mongoose。