2012-10-10 132 views
8

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

这不会工作

"created" : Date() 
+0

你有没有试过'新的Date()'? – udidu

+0

当我尝试“新日期()” – Simba

+0

你说什么'源/ json文件'意味着我得到一个失败解析JSON字符串错误? – udidu

回答

12

mongoimport旨在为CSV,TSV,或JSON格式的数据导入现有数据。如果你想插入新的字段(例如created时间戳),你将不得不为它们设置一个值。

例如,如果你想在created时间戳设置为当前时间,你可以得到命令行Unix时间戳(这将是自纪元秒):

$ date +%s 
1349960286 

JSON <date> representationmongoimport预计是一个64位有符号整数,表示自纪元以来的毫秒数。您需要在1000乘以unixtime秒值,并在您的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 
) 
+0

如果该字段是ISODate,那该怎么办?我注意到Date(timestamp)产生一个字符串,ISODate(sametimestamp)产生了一个完全不同且意外的日期。如何从字符串转换为ISODate格式? – Ketema

+4

['ISODate()'函数](https://github.com/mongodb/mongo/blob/v2.2/src/mongo/shell/utils.js#L400)是创建'Date( )'对象。 'ISODate()'构造函数需要一个ISO8601风格的日期/时间字符串,而'Date()'需要一个unixtime(自纪元以来的秒数)。如果你在'mongo' shell中尝试'new Date()'和'new ISODate()',你会发现它们都产生相同的值(一个'ISODate')。两种格式都有相同的[BSON表示法](http://bsonspec.org/#/specification),这是一个UTC日期时间。 – Stennie

3

由于Stennie正确地指出,你不能只mongoimportmongorestore做到这一点:他们只是恢复您以前转储的数据。正确的做法是恢复数据,然后对恢复的数据进行更新。

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

在你的情况,你需要像

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