猫鼬中哪个SchemaType最适合时间戳?


83

我正在使用Mongoose,MongoDB和Node。

我想定义一个架构,其中的一个字段是date \ timestamp。

我想使用此字段来返回最近5分钟内已更新的所有记录。

由于在Mongoose中我无法使用Timestamp()方法,因此我了解到,我唯一的选择是使用以下Javascript方法:

time : { type: Number, default: (new Date()).getTime() } 

这可能不是查询庞大数据库的最有效方法。如果有人可以分享一种更有效的实施方法,我将非常感激。

有什么方法可以用Mongoose来实现,并且可以使用MongoDB时间戳吗?

Answers:


135

编辑-2016年3月20日

猫鼬现在支持集合的时间戳

请考虑以下@bobbyz答案。也许这就是您想要的。

原始答案

猫鼬支持一种Date类型(基本上是时间戳):

time : { type : Date, default: Date.now }

使用以上字段定义,每当您保存带有未设置time字段的文档时,Mongoose都会使用当前时间填写该字段。

来源:http//mongoosejs.com/docs/guide.html


非常感谢您的回答,但是我想了解的是查询返回最近5分钟内已更新的所有记录的最佳方法。您是说我应该使用:date:{$ gt:((Math.round((new Date())。getTime()/ 1000))-300)}
Liatz 2012年

1
@ user1103897,您可以直接构造一个Date对象,并将其与$ gt一起使用,如下所示:var now = new Date(); var Fiveminago = new Date(now.getTime()-5 * 60 * 1000); 然后使用{date:{$ gt:fiveminago}}查询
mpobrien

19
应该应该Date.now代替Date.now()
Aleksei Zabrodskii 2012年

1
+1 elmigranto,猫鼬文档示例使用Date.now mongoosejs.com/docs/guide.html
亚伦

19
说明:Date.now因为Date.now是在创建对象时将运行的函数。Date.now()是您models.js被解析的日期。即,如果您使用Date.now()所有对象,则将具有相同的日期,也就是models.js被解析的日期。
mikemaccana

115

当前版本的Mongoose(v4.x)具有时间戳,作为架构的内置选项:

var mySchema = new mongoose.Schema( {name: String}, {timestamps: true} );

这个选项增加createdAtupdatedAt被加时间戳与性能Date,并做所有的工作适合你。每当您更新文档时,它都会更新updatedAt属性。架构时间戳文档。


3
谢谢您,文档尚不清楚人们可以使用timestamps: true而不是使用来覆盖名称timestamps: {...}
tar

2
@tar我认为它仍在工作,但是4.x文档曾经专门提到过timestamps: true,因此可能需要一些额外的考虑。(也许他们正在弃用它?您是对的,该选项的文档不是很清楚。)
bobbyz

14

如果您想要为createdAt和updatedAt自定义名称

const mongoose = require('mongoose');  
const { Schema } = mongoose;

const schemaOptions = {
  timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' },
};

const mySchema = new Schema({ name: String }, schemaOptions);

1
谢谢!!!这超级有帮助。正在搜索文档,但找不到该怎么做。再次感谢您的分享。
格雷格


0

我想使用此字段以返回最近5分钟内已更新的所有记录。

这意味着您每次保存对象时都需要将日期更新为“现在”。也许您会发现这很有用:Moongoose创建修改后的插件


-2

首先: npm install mongoose-timestamp

下一个: let Timestamps = require('mongoose-timestamp')

下一个: let MySchema = new Schema

下一个: MySchema.plugin(Timestamps)

下一个 : const Collection = mongoose.model('Collection',MySchema)

然后,您可以使用Collection.createdAt或所需的Collection.updatedAt任何位置。

创建于:周日期月日期年00:00:00 GMT

时间是这种格式。


它内置在Mongoose中,因此避免使用插件
SimonDragsbæk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.