PHP7 MongoDB扩展
2016-03-21 09:54
183 查看
看看这都神马函数名,还能再长一点吗?要赶超swift的函数名嘛?
MongoDB\Driver\Manager::executeBulkWrite
这玩意还配置了一个巨大的类库来配合调用:就是这个:https://github.com/mongodb/mongo-php-library ,纯粹是脱裤子放P,多此一举,本来原生扩展就已经巨长、巨难用,还配一个根本没有简化任何代码的库有什么意义?甚至于调用这个类库比原生的名字更长、更啰嗦,而且多了一层封装就多一次bug机会。
这个库文件总共63个,看看,如果你随便写个脚本访问一下mongodb,还得包含63个文件,我TM整个项目都没有63个文件好不好?这些个写惯了java的没事就老老实实写java,都跑来写php,php是要解析执行的,又不像jvm那么编译优化执行,搞那么多文件,不影响执行速度吗?真是狗屎,所以完全不推荐用这个狗屎库。
但是这个扩展最奇怪的就是文档超级简陋,根本不能获得任何有价值的信息,所以只能靠摸索来了。
下面是我用到的由MongoClient迁移到MongoDB\Driver的差异点。
MongoClient插入或更新是同样的代码:
MongoDB\Driver,插入和更新需要区分:
查询一条记录:
MongoClient:
MongoDB\Driver:
查询数量时候,需要注意:
查询结果集:
基本就这样,推荐自己封装一个简单的MongoDB\Driver,而不是使用那个巨大无比的库、也不推荐直接用原生。
MongoDB\Driver\Manager::executeBulkWrite
这玩意还配置了一个巨大的类库来配合调用:就是这个:https://github.com/mongodb/mongo-php-library ,纯粹是脱裤子放P,多此一举,本来原生扩展就已经巨长、巨难用,还配一个根本没有简化任何代码的库有什么意义?甚至于调用这个类库比原生的名字更长、更啰嗦,而且多了一层封装就多一次bug机会。
这个库文件总共63个,看看,如果你随便写个脚本访问一下mongodb,还得包含63个文件,我TM整个项目都没有63个文件好不好?这些个写惯了java的没事就老老实实写java,都跑来写php,php是要解析执行的,又不像jvm那么编译优化执行,搞那么多文件,不影响执行速度吗?真是狗屎,所以完全不推荐用这个狗屎库。
但是这个扩展最奇怪的就是文档超级简陋,根本不能获得任何有价值的信息,所以只能靠摸索来了。
下面是我用到的由MongoClient迁移到MongoDB\Driver的差异点。
MongoClient插入或更新是同样的代码:
(new MongoClient())->{$db}->{$collection}->save($arr); // 这个$arr数组可以直接含有 "_id" 索引来指定 mongodb文档的_id值,就这么简单粗暴,这才是php啊!
MongoDB\Driver,插入和更新需要区分:
$mongo = new MongoDB\Driver\Manager(); $bulk = new MongoDB\Driver\BulkWrite(['ordered' => true]); $data = $mongo->executeQuery('db.collection', new MongoDB\Driver\Query([]), new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY_PREFERRED))->toArray(); if (empty($data[0])) { // 确定不存在,插入 $bulk->insert($arr); } else { // 否者更新 $bulk->update([], array('$set' => $arr)); // $arr同样是刚才的数组 } // 还没完,还要执行下一步:db.collection要替换成实际的数据库、集合名 $result = $mongo->executeBulkWrite('db.collection', $bulk, new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000)); // 返回插入或更新是否成功: $ok = $result->getInsertedCount() || $result->getModifiedCount() ? 1 : 0; // 真是够了!
查询一条记录:
MongoClient:
(new MongoClient())->{$db}->{$collection}->findOne(['_id' => $id]);
MongoDB\Driver:
$mongo = new MongoDB\Driver\Manager(); $result = $mongo->executeQuery('db.collection', new MongoDB\Driver\Query(['_id'=>$id], []), new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY_PREFERRED)); // 返回的$result是一个对象,需要手动转换成数组。
查询数量时候,需要注意:
$mongo = new MongoDB\Driver\Manager(); $cursor = $mongo-executeCommand($db, new MongoDB\Driver\Command($arr), new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY_PREFERRED)); // 这里$cursor是一个游标。需要注意$arr里的字段: $arr = ['count'=>$collection, 'query'=>$query]; // 这里count必须排在前面,位置反了直接报异常。
查询结果集:
$mongo = new MongoDB\Driver\Manager(); $cursor = $mongo->executeQuery('db.collection', new MongoDB\Driver\Query($arr, $opts), new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY_PREFERRED)); //注意,这里的 $arr和 $opts; $arr = ['_id'=> ['$in'=> $ids] ]; // 根据id数组获取集合 $opts = ['limit'=> $limit, 'skip'=> $skip ]; // 不推荐 // 这里在传递$limit和$skip的时候,最好先转成整数,不然不生效: $opts = ['limit'=> (int) $limit, 'skip'=> (int) $skip ]; // 推荐写法。 // 写到这里,让人怀疑是不是在用php了,怎么还需要这样的类型转换。字符串整数都不行!
基本就这样,推荐自己封装一个简单的MongoDB\Driver,而不是使用那个巨大无比的库、也不推荐直接用原生。
相关文章推荐
- 一个关于if else容易迷惑的问题
- 分享微信开发Html5轻游戏中的几个坑
- 如何在 Fedora 上安装 MongoDB 服务器
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- JSP/PHP基于Ajax的分页功能实现
- PHP添加yaf xhprof mongodb 同理
- mongodb安装
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- 如何在 Ubuntu 上安装 MongoDB
- PHP数据库长连接mysql_pconnect的细节
- Php Installing An Expansion
- 信息安全聚合 Sec-News 的重构之路
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充
- Linux Apache+MySQL+PHP
- 建立Apache+PHP+MySQL数据库驱动的动态网站