2012-10-10 164 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 
    }, 
    } 
)