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();