【问题标题】:How create a Date field with default value as the current timestamp in MongoDb?如何在 MongoDb 中创建一个默认值作为当前时间戳的 Date 字段?
【发布时间】:2016-08-01 16:59:09
【问题描述】:

如何创建具有默认值的日期字段,默认值应该是集合中发生插入时的当前时间戳。

【问题讨论】:

  • 您是否使用任何驱动程序?编程语言?
  • 我们正在从 .Net 服务中获取数据..但那部分是没有访问权限的。有什么方法可以在 Mongo 设置本身中创建字段。
  • 如何插入文档?你使用的是mongodb-csharp驱动还是shell?

标签: mongodb mongodb-query


【解决方案1】:

这很简单! 例如,当您使用 Mongoose 时,您可以将函数作为默认值传递。 Mongoose 然后为每次插入调用该函数。

因此,在您的架构中,您会执行以下操作:

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

请记住只传递函数对象本身 Date.now 而不是函数调用的值 Date.now(),因为这只会将 Date 设置为创建 Schema 时的值。

此解决方案适用于 Mongoose 和 Node.Js,我希望这是您的用例,因为您没有更准确地指定。

【讨论】:

    【解决方案2】:

    使用 _id 获取时间戳。

    对于这个特定目的,您实际上不需要创建显式字段来保存时间戳。 mongo 默认创建的对象 id 即 "_id" 可用于实现此目的,从而为您节省额外的冗余空间。我假设您使用的是 node.js,因此您可以执行以下操作来获取特定文档的创建时间:

    let ObjectId = require('mongodb').ObjectID
    let docObjID = new ObjectId(<Your document _id>)
    console.log(docObjID.getTimestamp())
    

    而且,如果您使用的是 mongoose 之类的东西,请这样做:

    let mongoose = require('mongoose')
    let docObjID = mongoose.Types.ObjectId(<Your document _id>)
    console.log(docObjID.getTimestamp())
    

    阅读更多关于“_id”here的信息。

    【讨论】:

    【解决方案3】:

    创建文档时,时间戳是少数可以传递给构造函数或直接设置的可配置选项之一。

    const exampleSchema = new Schema({...}, { timestamps: true });
    

    之后,mongoose 将 createdAt 和 updatedAt 字段分配给您的架构,分配的类型是 Date。

    【讨论】:

      【解决方案4】:

      您只需在插入时执行此操作... 对于当前的timestamp

      collection.insert({ "date": datetime.now() } 
      

      【讨论】:

      • 感谢 thalaiva .. 这个查询我们可以处理通过查询运行每次插入我同意这一点。有没有办法通过配置像 RDBMS 概念来处理这个日期时间插入下面的查询 @columnName datetime default CURRENT_TIMESTAMP
      • @JagadeesanG:如果你要使用模式,你将需要猫鼬...... mongodb 就是这样的无模式。 mongoosejs.com/docs/2.7.x/docs/schematypes.html
      【解决方案5】:

      让我们考虑使用创建日期的用户架构,我们可以使用 mongoose 架构并将默认值作为 Date.now 传递

       var UserSchema = new Schema({
             name: {type: String, trim: true},
             created: {type: Date, default: Date.now}
      });
      

      如果我们想保存时间戳而不是数字,那么使用 Number 而不是这样的数字

      var UserSchema = new Schema({
             name: {type: String, trim: true},
             created: {type: Number, default: Date.now}
      });
      

      注意:- 当我们在默认参数中使用 Date.now() 时,这将 仅将日期设置为创建模式时的值, 因此您会发现日期与其他文档中的日期相同。最好使用 Date.now 而不是 Date.now()。

      【讨论】:

        【解决方案6】:

        这是一个没有设置默认值的命令,但它会插入一个带有当前时间戳的对象:

        db.foo.insert({date: new ISODate()});
        

        这些具有相同的效果:

        db.foo.insert({date: ISODate()});
        db.foo.insert({date: new Date()});
        

        请注意,没有newDate() 会有所不同——它不会返回ISODate 对象,而是一个字符串。

        此外,这些使用客户端的时间,而不是服务器的时间,这可能会有所不同(因为时间设置永远不会 100% 精确)。

        【讨论】:

          【解决方案7】:

          我只想指出,如果您希望时间戳以整数形式而不是日期格式存储,您可以这样做:

           {
             timestamp: { type: Number, default: Date.now},
             ...
           }
          

          【讨论】:

            【解决方案8】:

            谢谢朋友.. 我找到了另一种从 _id 字段获取时间戳的方法。 objectid.gettimestamp() 从中我们可以得到它的时间戳。

            【讨论】:

              【解决方案9】:

              这有点旧,但是我在使用 Date.now() 方法时发现,它没有获取当前日期和时间,它卡在您开始运行节点进程的时间。因此,所有时间戳都将默认为您启动服务器时的 Date.now()。 我解决此问题的一种方法是执行以下操作:

              ExampleSchema.pre('save', function (next) {
                  const instanceOfSchema = this;
                  if(!instanceOfSchema.created_at){
                    instanceOfSchema.created_at = Date.now();
                  }
                  instanceOfSchema.updated_at = Date.now();
                  next();
              })
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2013-06-20
                • 2016-04-07
                • 2015-03-02
                • 2018-01-13
                • 2013-08-06
                • 2012-02-29
                • 1970-01-01
                相关资源
                最近更新 更多