Mongodb 截至ISODate的Mongo聚合字符串

Mongodb 截至ISODate的Mongo聚合字符串,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,在集合中,我存储此类文档: { "_id" : ObjectId("55e8a5cba21b9e051eb448d1"), "created_at" : "2015-01-01T00:00:24Z", ... } 我想将创建的_的类型从String更改为ISODate,以便 { "_id" : ObjectId("55e8a5cba21b9e051eb448d1"), "created_at" : ISODate("2015-01-01T00:00:24

在集合中,我存储此类文档:

{
    "_id" : ObjectId("55e8a5cba21b9e051eb448d1"),
    "created_at" : "2015-01-01T00:00:24Z",
    ...
}
我想将创建的_的类型从String更改为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);
    }
);
但这是非常缓慢和低效的,我更喜欢使用聚合管道+out

这就是我所尝试的:

db.trial.aggregate(
    [
        {
            $project: {
                created_at : "$created_at",                                     
                created_at_iso: {$add: ISODate("$created_at_noTime") }
            }
        },
        {
            $out: "trialIso"
        }
    ],
    {
        allowDiskUse: true
    }
);
它抛出: E查询错误:无效的ISO日期

我不明白为什么

ISODate("2015-01-01T00:00:24Z")
在mongo shell中工作完美


(这是因为$created_at变量尚未在聚合管道中设置吗?

最好的方法是使用操作

var bulk=db.trial.initializeUnderedBulkop(),
计数=0;
db.trial.find().forEach(函数(doc){
bulk.find({“\u id”:doc.\u id}).updateOne({
“$set”:{“created_at”:ISODate(doc.created_at)}
})
计数++;
如果(计数%1000==0){
//每1000次操作执行一次并重新初始化
bulk.execute();
bulk=db.trial.initializeUnderedBulkop();
}
})
如果(计数%1000!=0)
bulk.execute();