在使用 MongoDB 和 Mongoose 进行 Web 开发时,处理时间戳是非常重要的一个问题。时间戳是指某个事件发生的时间,通常表示成一个整数或浮点数。在 Mongoose 中,时间戳是一个 Date 类型的对象,它可以方便地进行查询和排序。
Mongoose 中的时间戳有两种实现方式:使用 MongoDB 的原生时间戳类型或手动创建一个时间戳字段。
使用 MongoDB 的原生时间戳类型
MongoDB 中有一个 64 位的时间戳类型,它存储自纪元以来的毫秒数。Mongoose 支持使用原生时间戳类型,只需在 Schema 中添加以下定义:
const BlogSchema = new mongoose.Schema({ title: String, content: String, createdAt: { type: Date, default: Date.now } });
这样,每次向数据库中插入文档时,Mongoose 会自动设置 createdAt 字段为当前时间戳。我们可以通过以下方式查询所有包含 createdAt 字段的文档:
Blog.find({ createdAt: { $exists: true } }) .sort({ createdAt: -1 }) .exec((err, blogs) => { console.log(blogs); });
上面的查询会按时间倒序列出所有包含 createdAt 字段的文档,以便我们可以按时间排序。
我们也可以自定义时间戳的名称和默认值,如下所示:
const BlogSchema = new mongoose.Schema({ title: String, content: String, myTimestamp: { type: Date, default: Date.now, index: true } });
这样就会创建一个名为 myTimestamp 的时间戳字段,它默认值为当前时间,并创建一个索引以便效率查询。
手动创建时间戳字段
如果您不想使用 MongoDB 原生的时间戳类型,或者希望手动控制时间戳字段的名称和格式,您可以手动在 Schema 中添加一个字段:
const BlogSchema = new mongoose.Schema({ title: String, content: String, timestamp: { type: Number, default: Date.now } });
在这个例子中,我们手动创建了一个名为 timestamp 的时间戳字段,类型为数字,其默认值为当前时间。
然后,我们可以根据需要对时间戳进行格式化,例如:
// javascriptcn.com 代码示例 const BlogSchema = new mongoose.Schema({ title: String, content: String, timestamp: { type: Number, default: Date.now, get: function(v) { const date = new Date(v); return date.toLocaleDateString('en-US'); } } });
这样,我们就可以得到一个格式化的时间戳,而不是默认的数字类型。请注意,格式化时间戳会影响查询时的效率,因此请根据需要进行使用。
示例代码
下面是一个完整的示例代码,其中包括创建 Schema、插入文档、查询文档、删除文档等基本操作:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test'); const BlogSchema = new mongoose.Schema({ title: String, content: String, createdAt: { type: Date, default: Date.now, index: true } }); const Blog = mongoose.model('Blog', BlogSchema); const blog = new Blog({ title: 'Hello World', content: 'This is my first blog post!' }); blog.save((err, blog) => { if (err) { console.error(err); process.exit(1); } console.log('Blog saved:', blog); Blog.find({ createdAt: { $exists: true } }) .sort({ createdAt: -1 }) .exec((err, blogs) => { if (err) { console.error(err); process.exit(1); } console.log('All blogs:', blogs); Blog.deleteMany({}, (err) => { if (err) { console.error(err); process.exit(1); } console.log('All blogs deleted!'); process.exit(0); }); }); });
在上面的代码中,我们创建了一个名为 Blog 的模型,并定义了一个包含标题、内容和创建时间的 Schema。然后,我们创建了一篇博客并将其保存到 MongoDB 中。
接下来,我们查询了包含 createdAt 字段的所有博客,并按创建时间倒序排列。最后,我们删除了所有的博客,并退出程序。
总结
处理 Mongoose 中的时间戳是非常重要的,在使用时需要注意时间戳的格式和效率问题。本文介绍了使用 MongoDB 原生时间戳类型和手动创建时间戳字段的两种方法,并给出了例子代码。希望读者能够通过本文的介绍,更好地掌握 Mongoose 中的时间戳处理。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653809ec7d4982a6eb0aa7f6