首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongodb在运行脚本时推迟更新

mongodb在运行脚本时推迟更新
EN

Stack Overflow用户
提问于 2022-06-10 22:06:54
回答 1查看 28关注 0票数 0

我不明白我的迁移脚本是怎么回事。因此,有一个包含40+m记录的集合,而且这个集合在历史上没有严格的模型,所以我正在为一些可选字段添加默认值,例如,如果文档没有deleted_at,我将用null值添加它。

基本上,我将把文档分批到300,检查文档是否应该更新,如果应该更新,则进行更新。一切都很好,我能在9小时内更新1200万份文件。但是在那之后,一些奇怪的事情开始发生,首先,它的工作速度要慢得多,就像一个小时内的100 k文档,比以前慢了10倍。此外,从日志中,我可以看到脚本更新文档的速度相当快(我每秒钟有一堆与更新的文档相关的日志条目),但是如果我运行count查询来获取修改文档的数量,那么数量就不会经常增加。例如,根据10秒内的日志,将更新400行日志,但在运行count查询时,修改文档的数量不会增加。修改后的文档数量每隔一段时间只增加一次,例如,数量可以在2-3分钟内相同,然后在4k行上增加。

因此,我不明白为什么芒戈在某个时候开始以延迟的方式运行更新,调度它们或者别的什么,为什么它开始运行得更慢?

这个脚本相当大,但是我将尝试共享简化版本,这样您就可以看到我是如何遍历文档的:

代码语言:javascript
复制
class Migration {

    private Connection $connection;

    public function __construct(Connection $collection)
    {
        $this->connection = $collection;
    }

   public function migrate(): void
   {
        $totalAmount = $this->connection->collection('collection')->count();
        $chunkSize = 300;

        $lastIdInBatch = null;
        for ($i = 0; $i < $totalAmount; $i += $chunkSize) {
            $aggregation = [];
            $aggregation[] = [
                '$sort' => ['_id' => 1],
            ];
            if ($lastIdInBatch !== null) {
                $aggregation[] = [
                    '$match' => [
                        '_id' => [
                            '$gt' => new ObjectId($lastIdInBatch),
                        ],
                    ],
               ];
            }
            $aggregation[] = [
                '$limit' => $chunkSize,
            ];
            $documents = $this->connection->collection('collection')->raw()->aggregate(
                $aggregation
            );
            
            $lastIdInBatch = $documents[array_key_last($documents)]['_id'];
            
            foreach ($documents as $document) {
                // checks to see if we need to update the document
                // ....
                if (!empty($changes)) {
                   $updated = $this->connection
                      ->collection('collection')
                      ->where('_id', document['_id'])
                      ->update($changes);
                    if ($updated) {
                        Log::info('row udpated', ['product_id' => document['_id']]) // I see multiple of this logs each seconds, but no changes in database 
                    }
                }  
            }
          
        }
   }
}
EN

回答 1

Stack Overflow用户

发布于 2022-06-11 10:33:21

重新启动库伯内特斯吊舱后的问题自我愈合,所以似乎不是蒙戈的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72580246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档