gpt4 book ai didi

mongodb - Mongo 聚合字符串转 ISODate

转载 作者:可可西里 更新时间:2023-11-01 09:12:18 25 4
gpt4 key购买 nike

在集合中,我存储了这种文档:

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

我想将 created_at 的类型从 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 QUERY 错误:无效的 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();

关于mongodb - Mongo 聚合字符串转 ISODate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32427826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com