2015-09-06 100 views
3

在收集,我保存這樣的文件:蒙戈聚集字符串ISODate

{ 
    "_id" : ObjectId("55e8a5cba21b9e051eb448d1"), 
    "created_at" : "2015-01-01T00:00:24Z", 
    ... 
} 

我想改變從字符串created_at的類型,以ISODate得到

{ 
    "_id" : ObjectId("55e8a5cba21b9e051eb448d1"), 
    "created_at" : ISODate("2015-01-01T00:00:24Z)", 
    ... 
} 

我發現了一個解決方案:遍歷所有的收集做

db.trial.find().forEach(
    function(doc) { 
     doc.created_at = ISODate(doc.created_at); 
     db.events_January_watch.save(doc); 
    } 
); 

但是,這是非常緩慢和不夠高效,我寧願使用聚合管道+ $出

這是我的嘗試:

db.trial.aggregate(
    [ 
     { 
      $project: { 
       created_at : "$created_at",          
       created_at_iso: {$add: ISODate("$created_at_noTime") } 
      } 
     }, 
     { 
      $out: "trialIso" 
     } 
    ], 
    { 
     allowDiskUse: true 
    } 
); 

會拋出: è查詢錯誤:無效的ISO日期

我不明白爲什麼,因爲

ISODate("2015-01-01T00:00:24Z") 

在mongo shell中完美工作。

(這是因爲,在$ created_at變量尚未聚合管道設置?)

回答

4

要做到這一點,最好的辦法是使用"Bulk"操作

var bulk = db.trial.initializeUnorderedBulkOp(), 
    count = 0; 

db.trial.find().forEach(function(doc) { 
    bulk.find({ "_id": doc._id }).updateOne({ 
     "$set": { "created_at": ISODate(doc.created_at) } 
    }) 
    count++; 
    if (count % 1000 == 0) { 
     // Execute per 1000 operations and re-init 
     bulk.execute(); 
     bulk = db.trial.initializeUnorderedBulkOp(); 
    } 
}) 


if (count % 1000 != 0) 
    bulk.execute();