在Mongoose中,哪种SchemaType最适合用于时间戳?
在Mongoose中,哪种SchemaType最适合用于时间戳?
我使用的是Mongoose、MongoDB和Node。
我想定义一个模式,其中一个字段是日期/时间戳。
我想使用这个字段来返回在过去5分钟内更新的所有记录。
由于在Mongoose中无法使用Timestamp()方法,我明白我的唯一选择是使用以下JavaScript方法:
time : { type: Number, default: (new Date()).getTime() }
这可能不是查询庞大数据库的最有效方式。
如果有人能分享更有效的实现方法,我会非常感激。
有没有办法在Mongoose中实现这个,并能够使用MongoDB的时间戳?
在Mongoose中,有一个问题是如何为createdAt
和updatedAt
字段自定义名称。在搜索文档但找不到如何实现此功能之后,有人分享了一种解决方法。
解决方法是使用Mongoose中的SchemaType中的合适选项。通过在timestamps
选项中定义createdAt
和updatedAt
的自定义名称,可以实现这个目的。
以下是使用Mongoose的代码示例:
const mongoose = require('mongoose'); const { Schema } = mongoose; const schemaOptions = { timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }, }; const mySchema = new Schema({ name: String }, schemaOptions);
在上述示例中,timestamps
选项指定了createdAt
和updatedAt
字段的自定义名称。通过将这个选项传递给new Schema()
构造函数,可以创建一个具有自定义名称的模式。
这个解决方法对于那些希望在存储时间戳时使用不同名称的开发人员来说非常有用。通过定义自定义名称,开发人员可以根据自己的需求更好地组织和管理模型中的时间戳字段。
希望这个解决方法对于那些遇到相同问题的开发人员来说是有用的。感谢分享这个解决方法的人!
问题的出现原因:
问题出现的原因是因为Mongoose的当前版本(v4.x)中有一个内置的选项可以用于给模式添加时间戳。然而,文档中对于如何使用这个选项并不清楚。
解决方法:
解决方法是使用timestamps: true
选项来给模式添加时间戳。这个选项会自动为模式添加createdAt
和updatedAt
属性,并将它们的值设为当前的时间戳。当更新文档时,updatedAt
属性也会自动更新。
注意:
需要注意的是,虽然timestamps: true
选项仍然有效,但在4.x版本的文档中已经不再明确提到这个选项了。因此,在使用这个选项时,可能需要考虑一些额外的因素。也有可能,Mongoose正在逐渐弃用这个选项。不过,由于文档并不清楚,我们无法确定这一点。
在这个问题中,原问题提出了如何在Mongoose中使用最佳的SchemaType来处理时间戳的问题。原回答中提到Mongoose支持使用Date
类型来表示时间戳,并且给出了一个示例代码,使用Date.now
来设置默认值。同时,还有一个回复提到可以直接构造一个Date对象,并使用$gt来进行查询。
然而,这个问题的原回答是在2016年3月20日进行的,在那时Mongoose还没有直接支持集合的时间戳功能。所以,对于这个问题的最佳解决方法是使用Mongoose的Date
类型,并设置默认值为Date.now
。
以下是整理出的文章:
Mongoose中哪种SchemaType最适合用于时间戳?
Mongoose是一个用于在Node.js中操作MongoDB数据库的工具。在使用Mongoose时,我们经常需要处理时间戳的数据。那么在Mongoose中,哪种SchemaType最适合用于处理时间戳呢?
根据Mongoose官方文档的说明,Mongoose支持使用Date
类型来表示时间戳。下面是一个示例代码:
time: { type: Date, default: Date.now }
在上面的示例中,time
字段的类型被定义为Date
,并且设置了默认值为Date.now
。这意味着,如果保存一个没有设置time
字段的文档时,Mongoose会自动填充当前时间。
对于查询最近5分钟内更新的所有记录的最佳方法是使用Date.now
。可以直接构造一个Date对象,并使用$gt来进行查询,示例代码如下:
var now = new Date(); var fiveminago = new Date(now.getTime() - 5 * 60 * 1000);
然后,可以使用{date: {$gt: fiveminago}}
进行查询。
需要注意的是,在原回答中某些情况下,应该使用Date.now
而不是Date.now()
。因为Date.now
是一个在创建对象时运行的函数,而Date.now()
是models.js
文件解析时的日期。如果使用Date.now()
,所有的对象将具有相同的日期,即models.js
文件解析的日期。
在原问题中,某些情况下Mongoose现在已经支持集合的时间戳功能。然而,由于链接已经失效,无法查看具体的实现细节。对于这个问题的最佳解决方法,仍然是使用Mongoose的Date
类型,并设置默认值为Date.now
。
在Mongoose中,使用Date
类型并设置默认值为Date.now
是处理时间戳的最佳方式。通过构造一个Date对象并使用$gt进行查询,可以获取最近更新的记录。