如何在 PHP 中批量更新 mongodb?

Bon*_*lat 5 php performance mongodb

我目前有一些代码需要为数千个用户的每个用户执行多次更新,根据他们所采取的操作增加计数器,以便跟踪正在执行的操作。每个操作都包含子操作,这些子操作也需要更新计数。这些都需要按天进行跟踪。

因此,我存储“action”:“actionName”,“day”:day,“count”:计数,用于每天的操作(例如从外部网页传入,开始游戏,通过退出停止游戏,与游戏名称连接)很多游戏)。

每天我都会添加几千行(每个唯一操作一行),每天更新几十万次以增加计数。

相关代码如下(不包括创建操作数组)。

$m = new Mongo();
$db = $m->actionsDB;
$collection = $db->action_count;

foreach ($arr as $action) {
    $collection->update(array("action" => $action, "day" => $day),array('$inc' => array("count" => 1)),array("upsert" => true));)
}
$collection->ensureIndex(array("action" => 1, "day" => -1));
Run Code Online (Sandbox Code Playgroud)

对操作和子操作进行的一系列更新的示例是:startGame,20110417;启动GameZork,20110417;启动GameZorkWindows,20110417

问题似乎是,当这段代码在服务器上运行时,shell 中的 mongo 命令会排队。

目前我不确定为什么,我猜每秒更新这么多可能存在性能问题。

我想知道如何才能提高性能?我对 mongo 还很陌生,所以不完全确定有哪些选项可用。我查看了PHP的batchInsert,但我看不到任何提及执行batchUpdate的内容(因此不是更新,而是创建一个包含我当前更新的所有数据的数组,然后在一次数据库访问中执行batchUpdate)。

Mongo驱动版本是1.2.0,所以默认是长连接。

编辑:每秒约 1600 次更新(30 秒)之前、期间和之后的 db.serverStatus()。测试数据

小智 1

没有用于更新/更新插入的内置批处理。您只能通过调整查询表达式并添加一些进一步的过滤器来以某种方式“模拟”批次来限制要更新的文档。MongoDB 不会在这里帮助你。更新/更新插入是一项或全部。

  • 有点不正确。有一个使用 mongoimport 的批量更新插入。但你不能使用更新运算符,如 $inc、$set、$addToSet 等。 (2认同)