【问题标题】:Which SchemaType in Mongoose is Best for Timestamp?Mongoose 中的哪种 SchemaType 最适合时间戳?
【发布时间】:2012-04-17 20:55:20
【问题描述】:

我正在使用 Mongoose、MongoDB 和 Node。

我想定义一个模式,其中一个字段是日期\时间戳。

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

由于在 Mongoose 中我不能使用 Timestamp() 方法,我知道我唯一的选择是使用以下 Javascript 方法:

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

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

有没有办法用 Mongoose 实现这一点并能够使用 MongoDB 时间戳?

【问题讨论】:

    标签: node.js mongodb mongoose schema


    【解决方案1】:

    编辑 - 2016 年 3 月 20 日

    Mongoose 现在支持timestamps for collections

    请考虑answer of @bobbyz below。也许这就是你要找的。​​p>

    原答案

    Mongoose 支持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)}
    • @user1103897 您可以直接构造一个 Date 对象并将其与 $gt 一起使用,如下所示: var now = new Date(); var Fiveminago = new Date(now.getTime() - 5*60*1000);然后用 {date : {$gt:fiveminago}} 查询
    • 应该是Date.now 而不是Date.now()
    • +1 elmigranto,Mongoose 文档示例使用 Date.now mongoosejs.com/docs/guide.html
    • 解释:Date.now 因为Date.now 是一个在你创建对象时会运行的函数。 Date.now() 是您的 models.js 被解析的日期。即,如果您使用Date.now(),您的所有对象都将具有相同的日期,这将是解析models.js 的日期。
    【解决方案2】:

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

    这意味着您每次保存对象时都需要将日期更新为“现在”。也许你会发现这很有用:Moongoose create-modified plugin

    【讨论】:

      【解决方案3】:

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

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

      此选项添加了带有Date 时间戳的createdAtupdatedAt 属性,这将为您完成所有工作。每次更新文档时,它都会更新 updatedAt 属性。 Schema Timestamps Docs.

      【讨论】:

      • 谢谢,文档并不清楚是否可以使用 timestamps: true 而不是使用 timestamps: {...} 覆盖名称。
      • @tar 我认为它仍在工作,但 4.x 文档过去曾特别提到 timestamps: true,因此可能需要一些额外的考虑。 (也许他们正在弃用它?你是对的,文档对这个选项不是很清楚。)
      【解决方案4】:
      var ItemSchema = new Schema({
          name : { type: String }
      });
      
      ItemSchema.set('timestamps', true); // this will add createdAt and updatedAt timestamps
      

      文档:https://mongoosejs.com/docs/guide.html#timestamps

      【讨论】:

      • 我们可以将{ timestamps: true } 作为第二个参数传递给new Schema({}, {<here>})
      • 如何更改时间戳 createdAt 和 updatedAt 格式就像 (YYYY-MM-DD HH:mm:ss)
      【解决方案5】:

      第一:npm install mongoose-timestamp

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

      下一个:let MySchema = new Schema

      下一个:MySchema.plugin(Timestamps)

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

      然后你可以在任何你想要的地方使用Collection.createdAtCollection.updatedAt

      创建于:星期几月份日期年份 00:00:00 GMT

      时间就是这种格式。

      【讨论】:

      • Mongoose 内置,所以避免使用插件
      【解决方案6】:

      如果您想要为您的 createdAtupdatedAt 自定义名称

      const mongoose = require('mongoose');  
      const { Schema } = mongoose;
          
      const schemaOptions = {
        timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' },
      };
      
      const mySchema = new Schema({ name: String }, schemaOptions);
      

      【讨论】:

      • 谢谢!!!这非常有帮助。正在搜索文档,但找不到如何执行此操作。再次感谢分享。
      【解决方案7】:
      new mongoose.Schema({
          description: {
              type: String,
              required: true,
              trim: true
          },
          completed: {
              type: Boolean,
              default: false
          },
          owner: {
              type: mongoose.Schema.Types.ObjectId,
              required: true,
              ref: 'User'
          }
      }, {
          timestamps: true
      });
      

      【讨论】:

        【解决方案8】:

        Mongoose 现在支持架构中的时间戳。

        const item = new Schema(
          {
            id: {
              type: String,
              required: true,
            },
          { timestamps: true },
        );
        

        这将在每条记录创建时添加createdAtupdatedAt 字段。

        时间戳接口有字段

          interface SchemaTimestampsConfig {
            createdAt?: boolean | string;
            updatedAt?: boolean | string;
            currentTime?: () => (Date | number);
          }
        

        这将帮助我们选择我们想要的字段并覆盖日期格式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-28
          • 1970-01-01
          • 2016-12-15
          • 2012-06-07
          • 2016-01-06
          • 2011-02-27
          • 1970-01-01
          相关资源
          最近更新 更多