参考链接 https://docs.mongodb.com/manual/reference/command/nav-crud/
文中有一系列的可以批量处理的操作 下面show下 update
需求是这样:
定时执行的脚本,不同条件的执行一批数据 使用foreach 单挑更新的话 出错的几率更加的大
所提议选择了批量的更新 ,但是MongoCollecion 没有可以执行不同条件更新的函数
所以用到了原生的MongoDB\Driver\Manager::executeCommand
关于update 命令的部分
语法:
update collection name
updates 是二维的索引数组 内部有完整的数据结构
单个的数组的结构是
q array 正常的条件
u 是要更新的内容(这个等同于update()函数的更新的内容)
upsert 没有找到则插入,找到了则更新
multi true 符合条件的则全部更新 默认false 只更新第一条
return value:
如果执行遇到了错误 会出现字段 WriteErrors 是一个数组 ,
没有出错的话那么 字段不存在
上代码:
// gen cmd string $query = [ 'end_time' => [ '$gte' => 1505285294 ] ]; $query2 = [ 'end_time' => [ '$gte' => 1504972800, '$lt' => 1505285294 ] ]; $cmd = [ 'update' => 'sid_collection', 'updates' => [ //二维的索引数组 [ 'q' => $query, 'u' => ['$set' => ['tel' => '110-000']], 'upsert' => true, 'multi' => true ], [ 'q' => $query2, 'u' => ['$set' => ['tel' => '112-222']], 'upsert' => true, 'multi' => true ] ], ]; $command = new \MongoDB\Driver\Command($cmd); // gen mongo instance $mongo_manager = new \MongoDB\Driver\Manager('mongodb://ip:27017'); try { $data = $mongo_manager->executeCommand('crs', $command); } catch (MongoDB\Driver\Exception\RuntimeException $e) { echo $e->getMessage(), "\n"; exit; } var_dump($data);