蒙戈聚集字符串ISODate

问题描述:

在收集,我保存这样的文件:蒙戈聚集字符串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变量尚未聚合管道设置?)

要做到这一点,最好的办法是使用"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();