我不明白我的迁移脚本是怎么回事。因此,有一个包含40+m记录的集合,而且这个集合在历史上没有严格的模型,所以我正在为一些可选字段添加默认值,例如,如果文档没有deleted_at,我将用null值添加它。
基本上,我将把文档分批到300,检查文档是否应该更新,如果应该更新,则进行更新。一切都很好,我能在9小时内更新1200万份文件。但是在那之后,一些奇怪的事情开始发生,首先,它的工作速度要慢得多,就像一个小时内的100 k文档,比以前慢了10倍。此外,从日志中,我可以看到脚本更新文档的速度相当快(我每秒钟有一堆与更新的文档相关的日志条目),但是如果我运行count查询来获取修改文档的数量,那么数量就不会经常增加。例如,根据10秒内的日志,将更新400行日志,但在运行count查询时,修改文档的数量不会增加。修改后的文档数量每隔一段时间只增加一次,例如,数量可以在2-3分钟内相同,然后在4k行上增加。
因此,我不明白为什么芒戈在某个时候开始以延迟的方式运行更新,调度它们或者别的什么,为什么它开始运行得更慢?
这个脚本相当大,但是我将尝试共享简化版本,这样您就可以看到我是如何遍历文档的:
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
}
}
}
}
}
}发布于 2022-06-11 10:33:21
重新启动库伯内特斯吊舱后的问题自我愈合,所以似乎不是蒙戈的问题。
https://stackoverflow.com/questions/72580246
复制相似问题