乐闻世界logo
搜索文章和话题

Mongoose 如何自动添加 created at 和 updated at 字段?

9 个月前提问
5 个月前修改
浏览次数103

6个答案

1
2
3
4
5
6

当您在Mongoose中定义模式时,created_atupdated_at字段通常用于跟踪记录的创建和最后更新时间。要在Mongoose中添加这两个字段,您可以使用内置的timestamps选项,它会自动为您的模式添加这两个字段。以下是一个如何在Mongoose模式中实现它的示例:

javascript
const mongoose = require('mongoose'); const Schema = mongoose.Schema; // 定义模式 const exampleSchema = new Schema({ // 模式的其他字段 name: { type: String, required: true }, description: { type: String } // 您不需要显式添加created_at和updated_at字段 }, { timestamps: true // 这将会自动添加created_at和updated_at字段 }); // 创建模型 const ExampleModel = mongoose.model('Example', exampleSchema); module.exports = ExampleModel;

在这个例子中,timestamps选项被设置为true,这告诉Mongoose自动为每个模式实例添加createdAtupdatedAt字段。当您创建一个新的文档时,Mongoose会自动设置createdAtupdatedAt字段的值为当前时间戳。当您更新文档时,只有updatedAt字段会被更新为最新的时间戳。

默认情况下,这些字段被命名为createdAtupdatedAt。如果您想要自定义这些字段的名称,可以通过传递一个包含createdAtupdatedAt属性的对象来实现:

javascript
const exampleSchema = new Schema({ // 模式的其他字段 name: { type: String, required: true }, description: { type: String } }, { timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' } // 自定义字段名称 });

通过使用timestamps选项,您可以确保每次创建或更新文档时,这些字段都会自动得到处理,这样可以在不增加额外代码的情况下轻松跟踪文档的历史。

2024年6月29日 12:07 回复

更新:(5年后)

**注意:**如果您决定使用Kappa 架构事件溯源 + CQRS),那么您根本不需要更新日期。由于您的数据是不可变的、仅附加的事件日志,因此您只需要事件创建日期。类似于_Lambda 架构_,如下所述。那么您的应用程序状态是事件日志(派生数据)的投影。如果您收到有关现有实体的后续事件,则您将使用该事件的创建日期作为实体的更新日期。这是微服务系统中常用(且常被误解)的做法。

更新:(4年后)

如果您使用ObjectId作为您的_id字段(通常是这种情况),那么您需要做的就是:

shell
let document = { updatedAt: new Date(), }

检查下面我的原始答案,了解如何从_id字段获取创建的时间戳。如果您需要使用外部系统的 ID,请查看 Roman Rhrn Nesterov 的答案。

更新:(2.5年后)

现在,您可以将#timestamps选项与 mongoose 版本 >= 4.0 一起使用。

shell
let ItemSchema = new Schema({ name: { type: String, required: true, trim: true } }, { timestamps: true });

如果设置时间戳、猫鼬分配createdAtupdatedAt字段到您的模式,分配的类型是Date

您还可以指定时间戳字段的名称:

shell
timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }

**注意:**如果您正在开发包含关键数据的大型应用程序,您应该重新考虑更新文档。我建议您使用不可变的、仅附加的数据(lambda 架构)。这意味着您只允许插入。**不允许更新和删除!**如果您想“删除”一条记录,您可以轻松插入带有某些timestamp/的文档的新版本version ,然后将deleted字段设置为true。类似地,如果您想更新文档 - 您创建一个新文档,更新相应的字段并复制其余字段。然后,为了查询该文档,您将获得具有最新时间戳或最高版本的文档,即未“删除”(该deleted字段未定义或 false`)。

数据不变性确保您的数据是可调试的——您可以跟踪每个文档的历史记录。如果出现问题,您还可以回滚到文档的先前版本。如果您采用这样的架构ObjectId.getTimestamp()就足够了,并且它不依赖于 Mongoose。


原答案:

如果您使用 ObjectId 作为身份字段,则不需要created_at字段。ObjectIds 有一个名为 的方法getTimestamp()

ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp()

这将返回以下输出:

ISODate("2012-10-15T21:26:17Z")

更多信息请点击这里如何从 Mongo ObjectID 中提取创建日期

为了添加updated_at字段,您需要使用以下命令:

shell
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(); });
2024年6月29日 12:07 回复

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

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

您可以更改所使用字段的名称,如下所示:

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

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

2024年6月29日 12:07 回复

这就是我最终所做的:

shell
var ItemSchema = new Schema({ name : { type: String, required: true, trim: true } , created_at : { type: Date } , updated_at : { type: Date } }); ItemSchema.pre('save', function(next){ now = new Date(); this.updated_at = now; if ( !this.created_at ) { this.created_at = now; } next(); });
2024年6月29日 12:07 回复

使用您的架构的内置timestamps选项。

shell
var ItemSchema = new Schema({ name: { type: String, required: true, trim: true } }, { timestamps: true });

这会自动将createdAtupdatedAt字段添加到您的架构中。

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

2024年6月29日 12:07 回复

像这样添加timestamps到你的然后会自动为你生成Schema``createdAt``updatedAt

shell
var UserSchema = new Schema({ email: String, views: { type: Number, default: 0 }, status: Boolean }, { timestamps: {} });

在此输入图像描述


您也可以createdAt -> created_at通过以下方式更改

shell
timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
2024年6月29日 12:07 回复

你的答案