PHP操作Mongodb封装类完整实例

本文实例讲述了PHP操作Mongodb封装类。分享给大家供大家参考,具体如下:

getMongo() 得到原生的对象,更多API请自行查阅 Mongo PHP手册,后续版本将会对增加更多的原生API封装 * 3:该类所有API接口中的 $query 查询参数的使用请以下有关 [查询条件说明文档] * 4: 如果要存储中文字符,则一定要使用 utf8 的编码. * 5:有了本类接口基本可以按关系型数据库的概念完成Mongodb的大部分开发操作。 * * [查询条件说明文档] * * 参数:array('id'=>1) * 等同:where id=1 * * 参数:array('id'=>1,'num'=>10) * 等同:where id=1 and num=10 * * 参数:array('id'=>array($mongo->cmd('>')=>5)) * 等同:where id>5 * * 参数:array('id'=>array($mongo->cmd('!=')=>5)) * 等同:where id!=5 * * 参数:array('id'=>array($mongo->cmd('>')=>5,$mongo->cmd('<')=>10)) * 等同:where id>5 and id<10 * * 参数:array('id'=>array($mongo->cmd('in')=>array(2,5,6))) * 等同:where id in (2,6) * * 参数:array('id'=>array($mongo->cmd('%')=>array(2,1))) * 等同:where id % 2 = 1 * * 参数:array($mongo->cmd('or') => array( array('id'=>array($mongo->cmd('>')=>5)),array('id'=>array($mongo->cmd('<')=>10)) ) ) * 等同:where id>5 or id<10 * * 参数:array('username' => new mongoRegex("/yhp.*/")) * 等同 where username like "%yhp%" **/ class Library_Mongodb { /** * Mongodb 对象句柄 * * @var object Mongo */ private $_mongo = null; /** * 当前选择的数据库 * * @var object MongoDB */ private $_db = null; /** * 修改器命令前缀 * * @var string */ private $_cmd = '$'; /** * 调试模式 TRUE 打开 FALSE 关闭 * @var boolean */ const DEBUG = TRUE; /** * 查询条件映射关系 * * @var array */ private $_condMap = array( '<' => 'lt',// id > 1 '<=' => 'lte',// id <= 10 '>' => 'gt',// id > 5 '>=' => 'gte',// id >= 4 '!=' => 'ne',// id != 4 '%' => 'mod',// id % 4 = 0 'in' => 'in',// id in (1,2,3,4) 'notin' => 'nin',// id not in (1,4) 'or' => 'or',// id=1 or id=2 'not' => 'not',// !(id=1) ); /** * 构造函数 * * @param array $config 服务器配置,默认为: * array( * 'host'=>'localhost',// 主机名或IP地址 * 'port'=>27017,// 端口 * 'cmd'=>'$',// 修改器命令前缀 * ) */ public function __construct($config = array('host' => 'xxx','port' => 27017,'username' => 'xxx','password' => 'xxx','db' => 'xxx','cmd' => '$')){ $server = sprintf("mongodb://%s:%s@%s:%s/%s",$config['username'],$config['password'],$config['host'],$config['port'],$config['db']); // echo "connect\n"; try { $this->_mongo = new MongoClient($server,array('connect'=>true));// 立即连接 }catch (MongoConnectionException $e){ if(self::DEBUG) { echo $e->getMessage(); } return false; } $this->selectDB($config['db']); // 命令前缀 if(!isset($config['cmd'])){ $this->_cmd = ini_get('mongo.cmd'); if($this->_cmd == ''){ $this->_cmd = '$'; } } } /* ==================================== 基本操作接口API ================================= */ /** * 向集合(表)中插入新文档 * * 说明: * 1:类似mysql中的: insert into $colName set id=1,name='name1'; * * @param string $colName 集合名 * @param array $sets 数据,如: array('id'=>1,'name'=>'name1') * @param boolean $safe 是否安全操作 false:不等待服务器的响应直接返回 true:等待服务器的响应(数据非常重要时推荐) * @param boolean $fsync 操作后是否立即更新到碰盘,默认情况下由服务器决定 * * @return boolean */ public function insert($colName,$sets,$safe=false,$fsync=false){ $col = $this->_getCol($colName); try { $col->insert($sets,array('w'=>$safe,'fsync'=>$fsync)); return true; }catch (MongoCursorException $e){ return false; } } /** * 保存文档 * * 说明: * 1:如果 $sets 中有字段 "_id" 的话,则更新对应的文档;否则插入新文档 * * @param string $colName 集合名 * @param array $sets 数据,默认情况下由服务器决定 * * @return boolean */ public function save($colName,$fsync=false){ // 处理 '_id' 字段 $sets = $this->_parseId($sets); $ret = $this->_getCol($colName)->save($sets,'fsync'=>$fsync)); return $ret; } /** * 删除集合中的文档记录 * * 说明: * 1:类似mysql中的: delete from $colName where id=1; * * @param string $colName 集合名 * @param array $query 查询条件,如果为空数组的话,则会删除所有记录.具体请看 [查询条件说明文档] * @param boolean $delAll 是否删除所以条例查询的记录,默认为 true,当为 false是,类似效果 delete from tab where id=1 limit 1; * @param boolean $safe 是否安全操作 false:不等待服务器的响应直接返回 true:等待服务器的响应(数据非常重要时推荐) * @param boolean $fsync 操作后是否立即更新到碰盘,默认情况下由服务器决定 * * @return boolean */ public function delete($colName,$query=array(),$delAll=true,$fsync=false){ // 自动处理 '_id' 字段 $query = $this->_parseId($query); // 删除选项 $options = array( 'justOne' => !$delAll,'w' => $safe,'fsync' => $fsync,); $col = $this->_getCol($colName); return $col->remove($query,$options); } /** * 删除整个集合 * * 说明: * 1:集合中的索引也会被删除 * * @param string $colName 集合名 * * @return array */ public function dropCol($colName){ return $this->_getCol($colName)->drop(); } /** * 更新集合文档记录 * * 说明: * 1:类似mysql中的: update $colName set name='mongo' where id=10; * * @param string $colName 集合名 * @param array $newDoc 要更新的文档记录 * @param array $query 查询条件,如果为空数组则更新所有记录.具体请看 [查询条件说明文档] * @param string $option 操作选项,可选择项如下; * * 'set':只修改指定的字段(默认值,如果这个键不存在,则创建它。存在则更新). * 示例: update('user',array('name'=>'mongo'),array('id'=>10)); * 类似: update user set name='mongo' where id=10; * * 'inc':将指定的字段累加/减(如果值为负数则是相减,不存在键则创建。字段类型一定要是数字) * 示例:update('user',array('num'=>1),array('id'=>10),'inc'); * 类似: update user set num=num+1 where id=10; * * 'push':将文档添加到指定键中(数组),如果键不存在则会自动创建,存在则添加到该键的尾端。 * 示例:update('user',array('comm'=>array('commid'=>1,'title'=>'title1')),array('id'=>1),'push'); * 解说:为 id=1 的记录添加一个 comm 的评论字段,该字段对应一个 array('commid'=>1,'title'=>'title1') 的新文档。 * * 'pop':将指定键中的文档删除(数组) * 示例:update('user',array('comm'=>array('commid'=>1)),'pop'); * 解说:删除 id=1 的记录中 comm 对应的文档集合中 'commid'=>1 对应的文档. * * 'unset':在文档中删除指定的键 * 示例:update('user',array('name'=>1),'unset'); * 解说: 将 user 集合中将 id=1 对应的文档中的 name 字段删除 * * 'pull':删除文档中匹配其值的键 * 示例:update('user',array('name'=>'youname'),'pull'); * 解说:将 user 集合中将 id=1 对应的文档中的 name='youname' 的字段删除 * * 'addToSet':如果值不存在就添加(避免重复添加) * 示例:update('user',array('names'=>'youname'),'addToSet'); * 解说:向 user 集合中 id=1 对应的文档中的 names 字段添加 'youname' 这个值(不存在时才添加) * * 'replace':用 $newDoc 新文档替换 $query 所找到的文档 * 示例:update('user',array('newid'=>1,'newnames'=>'name1'),'replace'); * 解说:将 user 集合中 id=1 对应的文档用 array('newid'=>1,'newnames'=>'name1') 的新文档替换 * * @param boolean $upAll 是否更新找到的所有记录 * @param boolean $upsert 如果查询条件不存在时,是否以查询条件和要更新的字段一起新建一个集合 * @param boolean $safe 是否安全删除 false:不等待服务器的响应直接返回 true:等待服务器的响应(数据非常重要时推荐) * @param boolean $fsync 操作后是否立即更新到碰盘,默认情况下由服务器决定 * * @return boolean */ public function update($colName,$newDoc,$option='set',$upAll=true,$upsert=false,$fsync=false){ // 自动处理 '_id' 字段 $query = $this->_parseId($query); // 得到集合 $col = $this->_getCol($colName); // 重新组合新文档 if($option != 'replace'){ $newDoc = array($this->cmd($option) => $newDoc); } // 更新条件 $options = array( 'upsert' => $upsert,'multiple' => $upAll,); return $col->update($query,$options); } /** * 查询文档集,返回二维数组 * * 说明: * 1:类似mysql中的 select * from table * * 示例:select('user'); * 类似:select * from user; * * 示例:select('user',array('id','name')); * 类似:select id,name from user; * * 示例:select('user','name'),array('id'=>1)); * 类似:select id,name from user where id=1; * * 示例:select('user',array('num'=>1)); * 类似:select id,name from user where id=1 order by num asc; * * 示例:select('user',10); * 类似:select id,name from user where id=1 order by num asc limit 10; * * 示例:select('user',10,2); * 类似:select id,name from user where id=1 order by num asc limit 2,10; * * * * @param string $colName 集合名 * @param array $query 查询条件,具体请看 [查询条件说明文档] * @param array $fields 结果集返回的字段,array():表示返回所有字段 array('id','name'):表示只返回字段 "id,name" * @param array $sort 排序字段,array('id'=>1):表示按id字段升序 array('id'=>-1):表示按id字段降序 array('id'=>1,'age'=>-1):表示按id升序后再按age降序 * @param int $limit 取多少条记录 * @param int $skip 跳过多少条(从多少条开始) * * @return array */ public function select($colName,$fields=array(),$sort=array(),$limit=0,$skip=0){ // 得到集合 $col = $this->_getCol($colName); // 自动处理 '_id' 字段 $query = $this->_parseId($query); // 结果集偏历 $cursor = $col->find($query,$fields); // 排序 if($sort){ $cursor->sort($sort); } // 跳过记录数 if($skip > 0){ $cursor->skip($skip); } // 取多少行记录 if($limit > 0){ $cursor->limit($limit); } $result = array(); foreach($cursor as $row){ $result[] = $this->_parseArr($row); } return $result; } /** * 统计文档记录数 * * @param string $colName 集合名 * @param array $query 查询条件,具体请看 [查询条件说明文档] * @param int $limit 取多少条记录 * @param int $skip 跳过多少条 * @return unknown */ public function count($colName,$skip=0){ return $this->_getCol($colName)->count($query,$limit,$skip); } /** * 返回集合中的一条记录(一维数组) * * @param string $colName 集合名 * @param array $query 查询条件,name" * * @return array */ public function fetchRow($colName,$fields=array()){ // 得到集合名 $col = $this->_getCol($colName); // 自动处理 '_id' 字段 $query = $this->_parseId($query); // 处理结果集 return $this->_parseArr($col->findOne($query,$fields)); } /** * 返回符合条件的文档中字段的值 * * @param string $colName 集合名 * @param array $query 查询条件,具体请看 [查询条件说明文档] * @param string $fields 要取其值的字段,默认为 "_id" 字段,类似mysql中的自增主键 * * @return mixed */ public function fetchOne($colName,$fields='_id'){ $ret = $this->fetchRow($colName,$query,array($fields)); return isset($ret[$fields]) ? $ret[$fields] : false; } /** * 返回查询文档集合集中指定字段的值(一维数组) * * @param string $colName 集合名 * @param array $query 查询条件,类似mysql中的自增主键 * * @return array */ public function fetchCol($colName,$fields='_id'){ $result = array(); $list = $this->select($colName,array($fields)); foreach ($list as $row){ $result[] = $row[$fields]; } return $result; } /** * 返回指定下标的查询文档集合(二维数组) * * @param string $colName 集合名 * @param array $query 查询条件,类似mysql中的自增主键 * * @return array */ public function fetchAssoc($colName,$query); foreach ($list as $row){ $key = $row[$fields]; $result[][$key] = $row; } return $result; } /* ==================================== 辅助操作接口API ================================= */ /** * 返回命令或命令前缀 * * @param string $option 命令,如果为空时则返回命令前缀 * * @return string */ public function cmd($option=''){ // 只返回命令前缀 if($option == ''){ return $this->_cmd; } // 如果是操作符 if(isset($this->_condMap[$option])){ $option = $this->_condMap[$option]; } return $this->_cmd.$option; } /** * 选择或创建数据库(注意:新创建的数据库如果在关闭连接前没有写入数据将会被自动删除) * * @param string $dbname 数据库名 */ public function selectDB($dbname){ $this->_db = $this->_mongo->selectDB($dbname); } /** * 得到所有的数据库 * * @param boolean $onlyName 是否只返回数据库名的数组 * @return array */ public function allDB($onlyName=false){ $ary = $this->_mongo->listDBs(); if($onlyName){ $ret = array(); foreach ($ary['databases'] as $row){ $ret[] = $row['name']; } return $ret; }else{ return $ary; } } /** * 删除数据库 * * @return array */ public function dropDB($dbname){ return $this->_mongo->dropDB($dbname); } /** * 关闭连接 * */ public function close(){ $this->_mongo->close(); } /** * 得到 Mongo 原生对象,进行其它更高级的操作,详细请看PHP手册 * */ public function getMongo(){ return $this->_mongo; } /** * 返回最后的错误信息 * * @return array */ public function getError(){ return $this->_db->lastError(); } /* ======================= 以下为私有方法 ====================== */ // 解析数据组中的'_id'字段(如果有的话) private function _parseId($arr){ if(isset($arr['_id'])){ $arr['_id'] = new MongoId($arr['_id']); } return $arr; } // 得到集合对象 private function _getCol($colName){ return $this->_db->selectCollection($colName); } // 解析数组中的"_id"并且返回 private function _parseArr($arr){ if(!empty($arr)) { $ret = (array)$arr['_id']; $arr['_id'] = $ret['$id']; } return $arr; } }//End Class ?>

更多关于PHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》及《

希望本文所述对大家PHP程序设计有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读8.4k次,点赞8次,收藏7次。SourceCodester Online Tours & Travels Management System pay.php sql injectionLine 16 of pay.php invokes a SQL query built using unvalidated input. This call could allow an attacker to modify the statement’s meaning or to execute arbitrary SQL commands.SQL
文章浏览阅读3.4k次,点赞46次,收藏51次。本文为大家介绍在windwos系统搭建typecho博客+cpolar内网穿透工具将博客发布到公共网络环境,实现远程也可以访问和操作。_windows搭建typecho
文章浏览阅读1.1k次。- php是最优秀, 最原生的模板语言, 替代语法,让php更加的优雅的与html生活在一起 -->请放心, 最终生成的,或者说用户最终看到的,仍然是一个html文档, php代码中的内容不会被泄漏的。-- 将php与html代码混编的时候,大括号很容易造成配对错误,最好杜绝它 -->php标签内部代码由php.exe解释, php标签之外的代码原样输出,仍由web服务器解析。-- 所以php的流程控制语句, 都提供了替代语法,用冒号代替大括号 -->php echo '百变鹏仔'?_利用php将静态页面修改为动态页面
文章浏览阅读1.1k次,点赞18次,收藏15次。整理K8s网络相关笔记博文内容涉及 Linux network namespace 认知以及彼此通信Demo,实际中的应用理解不足小伙伴帮忙指正不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树。_linux network namespace 多端通信 模式认知
文章浏览阅读1.2k次,点赞22次,收藏19次。此网络模型提供了一个逻辑二层(L2)网络,该网络封装在跨 Kubernetes 集群节点的现有三层(L3)网络拓扑上。使用此模型,可以为容器提供一个隔离的 L2 网络,而无需分发路由。封装网络带来了少量的处理开销以及由于覆盖封装生成 IP header 造成的 IP 包大小增加。封装信息由 Kubernetes worker 之间的 UDP 端口分发,交换如何访问 MAC 地址的网络控制平面信息。此类网络模型中常用的封装是 VXLAN、Internet 协议安全性 (IPSec) 和 IP-in-IP。_k8s网络组件对比
文章浏览阅读1.1k次,点赞14次,收藏19次。当我们谈论网络安全时,我们正在讨论的是保护我们的在线空间,这是我们所有人的共享责任。网络安全涉及保护我们的信息,防止被未经授权的人访问、披露、破坏或修改。
文章浏览阅读1.3w次,点赞3次,收藏7次。尽管您可以通过 ping 命令解析出网站的 IP 地址,但是可能在浏览器中访问时仍然遇到问题,这可能是因为浏览器使用的 DNS 解析结果不同于 ping 命令使用的解析结果。可能是因为您的网络或设备上设置了防火墙,阻止了对特定网站的访问。有些国家或组织可能会对特定的域名进行屏蔽,从而阻止访问相关网站。如果您的网络使用代理服务器进行访问控制,可能会由于代理服务器的配置问题导致无法访问某些网站。即使您的网络和设备一切正常,目标网站本身可能也存在问题,例如服务器故障、维护或过载,导致无法访问。_能ping通打不开网页
文章浏览阅读839次,点赞22次,收藏19次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。
文章浏览阅读2.1k次,点赞31次,收藏22次。基于微信小程序奶茶点餐外卖系统设计与实现(PHP后台+Mysql)可行性分析毕设源代码毕业设计,数据安全和系统稳定性以及团队能力和资源配备方面都具备较好的条件。因此,该项目的可行性较高。:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;微信小程序作为一种快捷、方便的移动应用形式,成为很多用户点餐外卖的首选。项目的界面和功能都可以定制,包安装运行!项目配有对应开发文档、开题报告、任务书、PPT、论文模版等。
文章浏览阅读1.8k次,点赞52次,收藏38次。本文主要通过对系统的前台系统和后台管理系统进行了功能性需求分析,对系统的安全性和可扩展性进行了非功能性需求分析。在详细的需求分析的基础上,根据系统的功能设计确定了数据库结构,实现完整的代码编写。Lucky+Baby母婴用品网站使用 Dreamweaver、HBuilder代码编辑器、Apache服务器等开发工具,完成了系统的主要模块的页面设计和功能实现。本文展示了首页页面的实现效果图,并通过代码和页面介绍了用户注册功能、商品搜索功能、生成订单和查看我的订单功能、在线付款功能功能的实现过程。
文章浏览阅读1.5k次,点赞45次,收藏40次。本设计主要实现集人性化、高效率、便捷等优点于一身的人事信息管理系统,完成首页、系统用户、通知公告、部门信息、员工薪资、考勤签到、员工请假、招聘信息、应聘信息等功能模块。
文章浏览阅读1k次。该错误通常出现在数据库读取结果集数据时,比如当我们写好SQL语句从数据库读取数据时,本身应该返回结果集,再给结果集中读取数据。解决思路:这种错误一般是因为echo后面输出了一个数组导致的,或者是数组作为字符串进行拼接运算时导致的。该错误直译为:警告:mysqli_fetch_assoc函数期望参数1是mysqli的结果集,但是给了一个布尔值。这种错误是PHP解析器在解析时遇到了语法错误,直译为:解析错误:语法错误,意料之外的...该错误直译为:提示:未定义的索引:username。_array to string conversion in
文章浏览阅读2.7w次。解决http请求报错context deadline exceeded (Client.Timeout exceeded while awaiting headers)_context deadline exceeded (client.timeout exceeded while awaiting headers)
文章浏览阅读1.3k次,点赞26次,收藏24次。复杂网络是一种由大量相互连接的元素(节点或顶点)组成的网络结构,这些连接通常是非常复杂和动态的。这些网络可以在各种领域中发现,包括社交网络、生物学系统、信息技术和交通系统等。_代理建模
文章浏览阅读2.6k次,点赞76次,收藏71次。epoll详解,事件模型,ET/LT模式,并通过三个示例进行代码实现。
文章浏览阅读3.3k次。罗拉ROLA-IP是一家来自纽约的代理IP提供商,由李嘉诚先生投资建设,韩国人工智能、自动驾驶、虚拟现实方面的领军企业World IT Show投资入股,由美国纽约大学IT管理教授团队研究开发,进入中国市场6年多,全世界设有多个分子公司。接下来,我们要检查代理和防火墙的设置,因为在绝大多数情况下,它们是导致这个错误的原因,尤其是当用户使用免费代理时。对网站的访问受阻实际上是一个非常常见的错误,它既可能是由于物理原因(硬件问题)造成的,也可能是由于软件错误引起的。检查代理设置,并确保其正确配置。_无法访问此网站,检查代理服务器和防火墙
文章浏览阅读1.1k次,点赞14次,收藏20次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。_php洗车服务预约管理系统php源码
文章浏览阅读1.1k次。桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。
文章浏览阅读936次,点赞22次,收藏17次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。
文章浏览阅读822次,点赞15次,收藏14次。在整个设计过程中,要确定可能的具体解决方案,以实现每一个小的最终目标,对于每一个小目标,我们首先必须了解一些相关的需求分析信息。除了以上作品下面是2023-2024年最新100套计算机专业原创的毕业设计源码+数据库,是近期作品,如果你的题目刚好在下面可以文末领取java源码参考。springboot基于springboot的在线考试系统。springboot基于springboot的商城购物系统。springboot基于微信小程序的智慧校园设计与实现。springboot基于用户的协同过滤算法的话题推荐。