AWS DocumentDB BulkUpdate 运行时间长

问题描述

我仍然是 MongoDB/非关系模型数据存储的新手(来自 BI/DWH、关系数据库的经验),所以我在尝试理解如何编写 MongoDB 方面有点挣扎。请温柔点。 :)

MongoDB 版本:3.6.0

问题来了:

  • 我在 AWS 文档数据库实例的数据库中有一个集合。
  • 这个集合代表大约 1.5TB 的磁盘空间。其中一个字段长期以来一直作为字符串数据类型写入,尽管它实际上是一个日期字段。为了正确查询该集合,我需要将数据类型从字符串更改为日期。 为此,我编写了以下查询
var bulk = db.collection_name.initializeOrderedBulkOp();
var counter = 0;
db.collection_name.find().forEach(function(data) {    var updoc = {        "$set": {}    };
     var myKey = "snapshot_date";
     updoc["$set"][myKey] = new Date(data.snapshot_date);
     bulk.find({        "_id": data._id    }).update(updoc);
     counter++;
     if (counter % 1000 == 0) { bulk.execute(); bulk = db.collection_name.initializeOrderedBulkOp();    }});

我在上周一(两天前)开始了这个查询,它仍在运行。我已经检查过它是否仍在运行,我看到它引擎正在运行,并且 cloudwatch 显示有关 cpu 利用率、可用内存和正在更新的文档的活动。

我的问题:这个查询可以更有效吗?

我正在尝试更新每个文档而不过滤哪些应该和不应该更新,我知道这很多。

然而,即使在关系数据库中,我认为这不会花费这么长时间。

我应该尝试不同的技术来更新这个集合,还是创建一个指定了该 dtype 的新集合?

解决方法

如上所述,您正在执行 775 毫米单独更新操作。虽然以 1000 个批量执行此操作比一次执行一个要好,但仍需要很长时间才能完成。更高的性能是更新更大数量的文档范围,比如 50000,并发出多重更新。 MongoDB: how to update n records based on ObjectID 中有足够的代码可以帮助您更新此技术的代码。