更新:(5年后)
注意:如果您决定使用Kappa 架构(事件溯源 + CQRS),那么您根本不需要更新日期。由于您的数据是不可变的、仅追加的事件日志,因此您只需要事件创建日期。类似于Lambda 架构,如下所述。那么您的应用程序状态是事件日志(派生数据)的投影。如果您收到有关现有实体的后续事件,那么您将使用该事件的创建日期作为您的实体的更新日期。这是miceroservice系统中常用的(并且通常被误解)的做法。
更新:(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
. 类似地,如果您想更新一个文档 - 您创建一个新的文档,其中更新了相应的字段并复制了其余字段。然后为了查询此文档,您将获得具有最新时间戳或最高版本的文档,即没有“删除”(deleted
字段未定义或为假`)。
数据不变性确保您的数据是可调试的——您可以跟踪每个文档的历史记录。如果出现问题,您还可以回滚到文档的先前版本。如果您使用这样的架构ObjectId.getTimestamp()
,那么您只需要它,它不依赖于 Mongoose。
原始答案:
如果您使用 ObjectId 作为您的身份字段,则不需要该created_at
字段。ObjectIds 有一个名为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();
});