【问题标题】:MongoDb timestampMongoDb 时间戳
【发布时间】:2012-10-01 13:30:29
【问题描述】:

我已经创建并想现在导入一个虚拟集合。每个项目中的一个字段是“已创建”和“已更新”字段。我可以在源/json 文件中放入什么,以便 MongoDb 将当前日期和时间用作导入时的值?

这个不行

"created" : Date()

【问题讨论】:

  • 当我尝试“new Date()”时出现解析 JSON 字符串失败的错误
  • 你说source/json file是什么意思?
  • 正在导入 JSON 对象的文件
  • 你必须提供更多关于你在做什么的信息。您能否发布 json 文件的摘录以及如何导入它,并且可能是确切的错误。

标签: mongodb date collections timestamp unix-timestamp


【解决方案1】:

mongoimport 用于导入 CSV、TSV 或 JSON 格式的数据现有数据。如果要插入新字段(例如 created 时间戳),则必须为它们设置一个值。

例如,如果您想将 created 时间戳设置为当前时间,您可以从命令行获取一个 unix 时间戳(将是自纪元以来的秒数):

$ date +%s
1349960286

mongoimport 期望的 JSON <date> representation 是一个 64 位有符号整数,表示自纪元以来的毫秒数。您需要将 unixtime 秒值乘以 1000 并包含在您的 JSON 文件中:

{ "created": Date(1349960286000) }

另一种方法是在插入文档后将创建的时间戳添加到文档中。

例如:

db.mycoll.update(
    {created: { $exists : false }},    // Query criteria
    { $set : { created: new Date() }}, // Add 'created' timestamp
    false, // upsert
    true   // update all matching documents
)   

【讨论】:

  • 如果字段是 ISODate 怎么办?我注意到 Date(timestamp) 产生了一个字符串,而 ISODate(sametimestamp) 产生了一个完全不同的意外日期。如何从字符串转换为 ISODate 格式?
  • ISODate() function 是创建Date() 对象的便捷助手。 ISODate() 构造函数需要一个 ISO8601 样式的日期/时间字符串,而 Date() 需要一个 unixtime(自纪元以来的秒数)。如果您在mongo shell 中尝试new Date()new ISODate(),您应该会看到它们都产生相同的值(ISODate)。两种格式都有相同的BSON representation,这是一个UTC日期时间。
【解决方案2】:

正如 Stennie 正确指出的那样,您不能仅使用 mongoimportmongorestore 来执行此操作:它们仅用于恢复您之前转储的数据。正确的做法是先恢复数据,然后再对恢复的数据进行更新。

使用新的 mongo 2.6,您可以使用 $currentDate 操作轻松完成此操作,该操作旨在将时间更新为当前时间戳。

在你的情况下,你需要类似的东西

db.users.update( 
  {},
  {
     $currentDate: {
      created: true,
      updated: true
     },
  }
) 

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 1970-01-01
    • 2011-09-21
    • 2017-01-22
    • 2016-08-22
    • 2011-09-05
    • 2015-11-09
    • 2017-11-08
    相关资源
    最近更新 更多