给mongoose schemas添加created_at和updated_at字段

9 浏览
0 Comments

给mongoose schemas添加created_at和updated_at字段

有没有办法在mongoose模式中添加created_atupdated_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 }
});

admin 更改状态以发布 2023年5月21日
0
0 Comments

从Mongoose 4.0开始,您现在可以在模式上设置时间戳选项,让Mongoose为您处理:

var thingSchema = new Schema({..}, { timestamps: true });

您可以像这样更改使用的字段名称:

var thingSchema = new Schema({..}, { timestamps: { createdAt: 'created_at' } });

http://mongoosejs.com/docs/guide.html#timestamps

0
0 Comments

更新: (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将为模式分配createdAtupdatedAt字段,分配的类型为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。

0