当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP操作Mongodb封装类完整实例

发布:smiling 来源: PHP粉丝网  添加日期:2021-10-05 14:01:06 浏览: 评论:0 

这篇文章主要介绍了PHP操作Mongodb封装类,结合完整实例形式分析了php封装的针对MongoDB数据库常见的基本配置、连接、增删改查、集合等操作定义与使用方法,需要的朋友可以参考下。

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

  1. <?php 
  2. /** 
  3. * Mongodb 基本操作API,支持基本类似关系统型数据库的操作接口 
  4. * 
  5. * @version 1.0 
  6.  * [说明] 
  7.  * 
  8.  * 1:该版本API实现了 Mongodb 中最基本的插入/修改/查询/删除操作的封装 
  9.  * 2:其它更高级的操作可通过 $this->getMongo() 得到原生的对象,更多API请自行查阅 Mongo PHP手册,后续版本将会对增加更多的原生API封装 
  10.  * 3:该类所有API接口中的 $query 查询参数的使用请以下有关 [查询条件说明文档] 
  11.  * 4: 如果要存储中文字符,则一定要使用 utf8 的编码. 
  12.  * 5:有了本类接口基本可以按关系型数据库的概念完成Mongodb的大部分开发操作。 
  13.  * 
  14.  * [查询条件说明文档] 
  15.  * 
  16.  * 参数:array('id'=>1) 
  17.  * 等同:where id=1 
  18.  * 
  19.  * 参数:array('id'=>1,'num'=>10) 
  20.  * 等同:where id=1 and num=10 
  21.  * 
  22.  * 参数:array('id'=>array($mongo->cmd('>')=>5)) 
  23.  * 等同:where id>5 
  24.  * 
  25.  * 参数:array('id'=>array($mongo->cmd('!=')=>5)) 
  26.  * 等同:where id!=5 
  27.  * 
  28.  * 参数:array('id'=>array($mongo->cmd('>')=>5, $mongo->cmd('<')=>10)) 
  29.  * 等同:where id>5 and id<10 
  30.  * 
  31.  * 参数:array('id'=>array($mongo->cmd('in')=>array(2,5,6))) 
  32.  * 等同:where id in (2,5,6) 
  33.  * 
  34.  * 参数:array('id'=>array($mongo->cmd('%')=>array(2,1))) 
  35.  * 等同:where id % 2 = 1 
  36.  * 
  37.  * 参数:array($mongo->cmd('or') => array( array('id'=>array($mongo->cmd('>')=>5)), array('id'=>array($mongo->cmd('<')=>10)) ) ) 
  38.  * 等同:where id>5 or id<10 
  39.  * 
  40.  * 参数:array('username' => new mongoRegex("/yhp.*/"))  
  41.  * 等同 where username like "%yhp%" 
  42.  **/ 
  43. class Library_Mongodb { 
  44.   /** 
  45.    * Mongodb 对象句柄 
  46.    * 
  47.    * @var object Mongo 
  48.    */ 
  49.   private $_mongo = null; 
  50.   /** 
  51.    * 当前选择的数据库 
  52.    * 
  53.    * @var object MongoDB 
  54.    */ 
  55.   private $_db = null; 
  56.   /** 
  57.    * 修改器命令前缀 
  58.    * 
  59.    * @var string 
  60.    */ 
  61.   private $_cmd = '$'
  62.   /** 
  63.    * 调试模式 TRUE 打开 FALSE 关闭 
  64.    * @var boolean 
  65.    */ 
  66.   const DEBUG = TRUE; 
  67.   /** 
  68.    * 查询条件映射关系 
  69.    * 
  70.    * @var array 
  71.    */ 
  72.   private $_condMap = array
  73.     '<'    =>  'lt'// id > 1 
  74.     '<='  =>  'lte'// id <= 10 
  75.     '>'    =>  'gt'// id > 5 
  76.     '>='  =>  'gte'// id >= 4 
  77.     '!='  =>  'ne'// id != 4 
  78.     '%'    =>  'mod'// id % 4 = 0 
  79.     'in'  =>  'in'// id in (1,2,3,4) 
  80.     'notin'  =>  'nin',// id not in (1,2,3,4) 
  81.     'or'  =>  'or'// id=1 or id=2 
  82.     'not'  =>  'not'// !(id=1) 
  83.   ); 
  84.   /** 
  85.    * 构造函数 
  86.    * 
  87.    * @param array $config 服务器配置,默认为: 
  88.    * array( 
  89.    * 'host'=>'localhost', // 主机名或IP地址 
  90.    * 'port'=>27017, // 端口 
  91.    * 'cmd'=>'$', // 修改器命令前缀 
  92.    * ) 
  93.    */ 
  94.   public function __construct($config = array('host' => 'xxx''port' => 27017, 'username' => 'xxx''password' => 'xxx''db' => 'xxx''cmd' => '$')){ 
  95.     $server = sprintf("mongodb://%s:%s@%s:%s/%s"$config['username'], $config['password'], $config['host'], $config['port'], $config['db']); 
  96. //    echo "connect\n"; 
  97.     try { 
  98.       $this->_mongo = new MongoClient($serverarray('connect'=>true));// 立即连接 
  99.     }catch (MongoConnectionException $e){ 
  100.       if(self::DEBUG) { 
  101.         echo $e->getMessage(); 
  102.       } 
  103.       return false; 
  104.     } 
  105.     $this->selectDB($config['db']); 
  106.     // 命令前缀 
  107.     if(!isset($config['cmd'])){ 
  108.       $this->_cmd = ini_get('mongo.cmd'); 
  109.       if($this->_cmd == ''){ 
  110.         $this->_cmd = '$'
  111.       } 
  112.     } 
  113.   } 
  114.   /* ==================================== 基本操作接口API ================================= */ 
  115.   /** 
  116.    * 向集合(表)中插入新文档 
  117.    * 
  118.    * 说明: 
  119.    * 1:类似mysql中的: insert into $colName set id=1,name='name1'; 
  120.    * 
  121.    * @param string $colName 集合名 
  122.    * @param array $sets 数据,如: array('id'=>1,'name'=>'name1') 
  123.    * @param boolean $safe 是否安全操作 false:不等待服务器的响应直接返回 true:等待服务器的响应(数据非常重要时推荐) 
  124.    * @param boolean $fsync 操作后是否立即更新到碰盘,默认情况下由服务器决定 
  125.    * 
  126.    * @return boolean 
  127.    */ 
  128.   public function insert($colName$sets$safe=false, $fsync=false){ 
  129.     $col = $this->_getCol($colName); 
  130.     try { 
  131.       $col->insert($sets,array('w'=>$safe,'fsync'=>$fsync)); 
  132.       return true; 
  133.     }catch (MongoCursorException $e){ 
  134.       return false; 
  135.     } 
  136.   } 
  137.   /** 
  138.    * 保存文档 
  139.    * 
  140.    * 说明: 
  141.    * 1:如果 $sets 中有字段 "_id" 的话,则更新对应的文档;否则插入新文档 
  142.    * 
  143.    * @param string $colName 集合名 
  144.    * @param array $sets 数据,如: array('id'=>1,'name'=>'name1') 
  145.    * @param boolean $safe 是否安全操作 false:不等待服务器的响应直接返回 true:等待服务器的响应(数据非常重要时推荐) 
  146.    * @param boolean $fsync 操作后是否立即更新到碰盘,默认情况下由服务器决定 
  147.    * 
  148.    * @return boolean 
  149.    */ 
  150.   public function save($colName$sets$safe=false, $fsync=false){ 
  151.     // 处理 '_id' 字段 
  152.     $sets = $this->_parseId($sets); 
  153.     $ret = $this->_getCol($colName)->save($sets,array('w'=>$safe,'fsync'=>$fsync)); 
  154.     return $ret
  155.   } 
  156.   /** 
  157.    * 删除集合中的文档记录 
  158.    * 
  159.    * 说明: 
  160.    * 1:类似mysql中的: delete from $colName where id=1; 
  161.    * 
  162.    * @param string $colName 集合名 
  163.    * @param array $query 查询条件,如果为空数组的话,则会删除所有记录.具体请看 [查询条件说明文档] 
  164.    * @param boolean $delAll 是否删除所以条例查询的记录,默认为 true,当为 false是,类似效果 delete from tab where id=1 limit 1; 
  165.    * @param boolean $safe 是否安全操作 false:不等待服务器的响应直接返回 true:等待服务器的响应(数据非常重要时推荐) 
  166.    * @param boolean $fsync 操作后是否立即更新到碰盘,默认情况下由服务器决定 
  167.    * 
  168.    * @return boolean 
  169.    */ 
  170.   public function delete($colName,$query=array(),$delAll=true,$safe=false,$fsync=false){ 
  171.     // 自动处理 '_id' 字段 
  172.     $query = $this->_parseId($query); 
  173.     // 删除选项 
  174.     $options = array
  175.       'justOne'  =>  !$delAll
  176.       'w'      =>  $safe
  177.       'fsync'    =>  $fsync
  178.     ); 
  179.     $col = $this->_getCol($colName); 
  180.     return $col->remove($query,$options); 
  181.   } 
  182.   /** 
  183.    * 删除整个集合 
  184.    * 
  185.    * 说明: 
  186.    * 1:集合中的索引也会被删除 
  187.    * 
  188.    * @param string $colName 集合名 
  189.    * 
  190.    * @return array 
  191.    */ 
  192.   public function dropCol($colName){ 
  193.     return $this->_getCol($colName)->drop(); 
  194.   } 
  195.   /** 
  196.    * 更新集合文档记录 
  197.    * 
  198.    * 说明: 
  199.    * 1:类似mysql中的: update $colName set name='mongo' where id=10; 
  200.    * 
  201.    * @param string $colName 集合名 
  202.    * @param array $newDoc 要更新的文档记录 
  203.    * @param array $query 查询条件,如果为空数组则更新所有记录.具体请看 [查询条件说明文档] 
  204.    * @param string $option 操作选项,可选择项如下; 
  205.    * 
  206.    * 'set':只修改指定的字段(默认值,如果这个键不存在,则创建它。存在则更新). 
  207.    * 示例: update('user', array('name'=>'mongo'), array('id'=>10)); 
  208.    * 类似: update user set name='mongo' where id=10; 
  209.    * 
  210.    * 'inc':将指定的字段累加/减(如果值为负数则是相减,不存在键则创建。字段类型一定要是数字) 
  211.    * 示例:update('user', array('num'=>1), array('id'=>10), 'inc'); 
  212.    * 类似: update user set num=num+1 where id=10; 
  213.    * 
  214.    * 'push':将文档添加到指定键中(数组),如果键不存在则会自动创建,存在则添加到该键的尾端。 
  215.    * 示例:update('user', array('comm'=>array('commid'=>1,'title'=>'title1')), array('id'=>1), 'push'); 
  216.    * 解说:为 id=1 的记录添加一个 comm 的评论字段,该字段对应一个 array('commid'=>1,'title'=>'title1') 的新文档。 
  217.    * 
  218.    * 'pop':将指定键中的文档删除(数组) 
  219.    * 示例:update('user', array('comm'=>array('commid'=>1)), array('id'=>1), 'pop'); 
  220.    * 解说:删除 id=1 的记录中 comm 对应的文档集合中 'commid'=>1 对应的文档. 
  221.    * 
  222.    * 'unset':在文档中删除指定的键 
  223.    * 示例:update('user', array('name'=>1), array('id'=>1), 'unset'); 
  224.    * 解说: 将 user 集合中将 id=1 对应的文档中的 name 字段删除 
  225.    * 
  226.    * 'pull':删除文档中匹配其值的键 
  227.    * 示例:update('user', array('name'=>'youname'), array('id'=>1), 'pull'); 
  228.    * 解说:将 user 集合中将 id=1 对应的文档中的 name='youname' 的字段删除 
  229.    * 
  230.    * 'addToSet':如果值不存在就添加(避免重复添加) 
  231.    * 示例:update('user', array('names'=>'youname'), array('id'=>1), 'addToSet'); 
  232.    * 解说:向 user 集合中 id=1 对应的文档中的 names 字段添加 'youname' 这个值(不存在时才添加) 
  233.    * 
  234.    * 'replace':用 $newDoc 新文档替换 $query 所找到的文档 
  235.    * 示例:update('user', array('newid'=>1,'newnames'=>'name1'), array('id'=>1), 'replace'); 
  236.    * 解说:将 user 集合中 id=1 对应的文档用 array('newid'=>1,'newnames'=>'name1') 的新文档替换 
  237.    * 
  238.    * @param boolean $upAll 是否更新找到的所有记录 
  239.    * @param boolean $upsert 如果查询条件不存在时,是否以查询条件和要更新的字段一起新建一个集合 
  240.    * @param boolean $safe 是否安全删除 false:不等待服务器的响应直接返回 true:等待服务器的响应(数据非常重要时推荐) 
  241.    * @param boolean $fsync 操作后是否立即更新到碰盘,默认情况下由服务器决定 
  242.    * 
  243.    * @return boolean 
  244.    */ 
  245.   public function update($colName,$newDoc,$query=array(),$option='set',$upAll=true,$upsert=false,$safe=false,$fsync=false){ 
  246.     // 自动处理 '_id' 字段 
  247.     $query = $this->_parseId($query); 
  248.     // 得到集合 
  249.     $col = $this->_getCol($colName); 
  250.     // 重新组合新文档 
  251.     if($option != 'replace'){ 
  252.       $newDoc = array($this->cmd($option) => $newDoc); 
  253.     } 
  254.     // 更新条件 
  255.     $options = array
  256.       'upsert'  =>  $upsert
  257.       'multiple'  =>  $upAll
  258.       'w'      =>  $safe
  259.       'fsync'    =>  $fsync
  260.     ); 
  261.     return $col->update($query,$newDoc,$options); 
  262.   } 
  263.   /** 
  264.    * 查询文档集,返回二维数组 
  265.    * 
  266.    * 说明: 
  267.    * 1:类似mysql中的 select * from table 
  268.    * 
  269.    * 示例:select('user'); 
  270.    * 类似:select * from user; 
  271.    * 
  272.    * 示例:select('user',array('id','name')); 
  273.    * 类似:select id,name from user; 
  274.    * 
  275.    * 示例:select('user',array('id','name'),array('id'=>1)); 
  276.    * 类似:select id,name from user where id=1; 
  277.    * 
  278.    * 示例:select('user',array('id','name'),array('id'=>1),array('num'=>1)); 
  279.    * 类似:select id,name from user where id=1 order by num asc; 
  280.    * 
  281.    * 示例:select('user',array('id','name'),array('id'=>1),array('num'=>1),10); 
  282.    * 类似:select id,name from user where id=1 order by num asc limit 10; 
  283.    * 
  284.    * 示例:select('user',array('id','name'),array('id'=>1),array('num'=>1),10,2); 
  285.    * 类似:select id,name from user where id=1 order by num asc limit 2,10; 
  286.    * 
  287.    * 
  288.    * 
  289.    * @param string $colName 集合名 
  290.    * @param array $query 查询条件,具体请看 [查询条件说明文档] 
  291.    * @param array $fields 结果集返回的字段, array():表示返回所有字段 array('id','name'):表示只返回字段 "id,name" 
  292.    * @param array $sort 排序字段, array('id'=>1):表示按id字段升序 array('id'=>-1):表示按id字段降序 array('id'=>1, 'age'=>-1):表示按id升序后再按age降序 
  293.    * @param int $limit 取多少条记录 
  294.    * @param int $skip 跳过多少条(从多少条开始) 
  295.    * 
  296.    * @return array 
  297.    */ 
  298.   public function select($colName,$query=array(),$fields=array(),$sort=array(),$limit=0,$skip=0){ 
  299.     // 得到集合 
  300.     $col = $this->_getCol($colName); 
  301.     // 自动处理 '_id' 字段 
  302.     $query = $this->_parseId($query); 
  303.     // 结果集偏历 
  304.     $cursor = $col->find($query,$fields); 
  305.     // 排序 
  306.     if($sort){ 
  307.       $cursor->sort($sort); 
  308.     } 
  309.     // 跳过记录数 
  310.     if($skip > 0){ 
  311.       $cursor->skip($skip); 
  312.     } 
  313.     // 取多少行记录 
  314.     if($limit > 0){ 
  315.       $cursor->limit($limit); 
  316.     } 
  317.     $result = array(); 
  318.     foreach($cursor as $row){ 
  319.       $result[] = $this->_parseArr($row); 
  320.     } 
  321.     return $result
  322.   } 
  323.   /** 
  324.    * 统计文档记录数 
  325.    * 
  326.    * @param string $colName 集合名 
  327.    * @param array $query 查询条件,具体请看 [查询条件说明文档] 
  328.    * @param int $limit 取多少条记录 
  329.    * @param int $skip 跳过多少条 
  330.    * @return unknown 
  331.    */ 
  332.   public function count($colName,$query=array(),$limit=0,$skip=0){ 
  333.     return $this->_getCol($colName)->count($query,$limit,$skip); 
  334.   } 
  335.   /** 
  336.    * 返回集合中的一条记录(一维数组) 
  337.    * 
  338.    * @param string $colName 集合名 
  339.    * @param array $query 查询条件,具体请看 [查询条件说明文档] 
  340.    * @param array $fields 结果集返回的字段, array():表示返回所有字段 array('id','name'):表示只返回字段 "id,name" 
  341.    * 
  342.    * @return array 
  343.    */ 
  344.   public function fetchRow($colName,$query=array(), $fields=array()){ 
  345.     // 得到集合名 
  346.     $col = $this->_getCol($colName); 
  347.     // 自动处理 '_id' 字段 
  348.     $query = $this->_parseId($query); 
  349.     // 处理结果集 
  350.     return $this->_parseArr($col->findOne($query,$fields)); 
  351.   } 
  352.   /** 
  353.    * 返回符合条件的文档中字段的值 
  354.    * 
  355.    * @param string $colName 集合名 
  356.    * @param array $query 查询条件,具体请看 [查询条件说明文档] 
  357.    * @param string $fields 要取其值的字段,默认为 "_id" 字段,类似mysql中的自增主键 
  358.    * 
  359.    * @return mixed 
  360.    */ 
  361.   public function fetchOne($colName,$query=array(), $fields='_id'){ 
  362.     $ret = $this->fetchRow($colName,$query,array($fields)); 
  363.     return isset($ret[$fields]) ? $ret[$fields] : false; 
  364.   } 
  365.   /** 
  366.    * 返回查询文档集合集中指定字段的值(一维数组) 
  367.    * 
  368.    * @param string $colName 集合名 
  369.    * @param array $query 查询条件,具体请看 [查询条件说明文档] 
  370.    * @param string $fields 要取其值的字段,默认为 "_id" 字段,类似mysql中的自增主键 
  371.    * 
  372.    * @return array 
  373.    */ 
  374.   public function fetchCol($colName,$query=array(), $fields='_id'){ 
  375.     $result = array(); 
  376.     $list = $this->select($colName,$query,array($fields)); 
  377.     foreach ($list as $row){ 
  378.       $result[] = $row[$fields]; 
  379.     } 
  380.     return $result
  381.   } 
  382.   /** 
  383.    * 返回指定下标的查询文档集合(二维数组) 
  384.    * 
  385.    * @param string $colName 集合名 
  386.    * @param array $query 查询条件,具体请看 [查询条件说明文档] 
  387.    * @param string $fields 要取其值的字段,默认为 "_id" 字段,类似mysql中的自增主键 
  388.    * 
  389.    * @return array 
  390.    */ 
  391.   public function fetchAssoc($colName,$query=array(), $fields='_id'){ 
  392.     $result = array(); 
  393.     $list = $this->select($colName,$query); 
  394.     foreach ($list as $row){ 
  395.       $key = $row[$fields]; 
  396.       $result[][$key] = $row
  397.     } 
  398.     return $result
  399.   } 
  400.   /* ==================================== 辅助操作接口API ================================= */ 
  401.   /** 
  402.    * 返回命令或命令前缀 
  403.    * 
  404.    * @param string $option 命令,如果为空时则返回命令前缀 
  405.    * 
  406.    * @return string 
  407.    */ 
  408.   public function cmd($option=''){ 
  409.     // 只返回命令前缀 
  410.     if($option == ''){ 
  411.       return $this->_cmd; 
  412.     } 
  413.     // 如果是操作符 
  414.     if(isset($this->_condMap[$option])){ 
  415.       $option = $this->_condMap[$option]; 
  416.     } 
  417.     return $this->_cmd.$option
  418.   } 
  419.   /** 
  420.    * 选择或创建数据库(注意:新创建的数据库如果在关闭连接前没有写入数据将会被自动删除) 
  421.    * 
  422.    * @param string $dbname 数据库名 
  423.    */ 
  424.   public function selectDB($dbname){ 
  425.     $this->_db = $this->_mongo->selectDB($dbname); 
  426.   } 
  427.   /** 
  428.    * 得到所有的数据库 
  429.    * 
  430.    * @param boolean $onlyName 是否只返回数据库名的数组 
  431.    * @return array 
  432.    */ 
  433.   public function allDB($onlyName=false){ 
  434.     $ary = $this->_mongo->listDBs(); 
  435.     if($onlyName){ 
  436.       $ret = array(); 
  437.       foreach ($ary['databases'as $row){ 
  438.         $ret[] = $row['name']; 
  439.       } 
  440.       return $ret
  441.     }else
  442.       return $ary
  443.     } 
  444.   } 
  445.   /** 
  446.    * 删除数据库 
  447.    * 
  448.    * @return array 
  449.    */ 
  450.   public function dropDB($dbname){ 
  451.     return $this->_mongo->dropDB($dbname); 
  452.   } 
  453.   /** 
  454.    * 关闭连接 
  455.    * 
  456.    */ 
  457.   public function close(){ 
  458.     $this->_mongo->close(); 
  459.   } 
  460.   /** 
  461.    * 得到 Mongo 原生对象,进行其它更高级的操作,详细请看PHP手册 
  462.    * 
  463.    */ 
  464.   public function getMongo(){ 
  465.     return $this->_mongo; 
  466.   } 
  467.   /** 
  468.    * 返回最后的错误信息 
  469.    * 
  470.    * @return array 
  471.    */ 
  472.   public function getError(){ 
  473.     return $this->_db->lastError(); 
  474.   } 
  475.   /* ======================= 以下为私有方法 ====================== */ 
  476.   // 解析数据组中的'_id'字段(如果有的话) 
  477.   private function _parseId($arr){ 
  478.     if(isset($arr['_id'])){ 
  479.       $arr['_id'] = new MongoId($arr['_id']); 
  480.     } 
  481.     return $arr
  482.   } 
  483.   // 得到集合对象 
  484.   private function _getCol($colName){ 
  485.     return $this->_db->selectCollection($colName); 
  486.   } 
  487.   // 解析数组中的"_id"并且返回 
  488.   private function _parseArr($arr){ 
  489.     if(!emptyempty($arr)) { 
  490.       $ret = (array)$arr['_id']; 
  491.       $arr['_id'] = $ret['$id']; 
  492.     } 
  493.     return $arr
  494.   } 
  495. }//End Class 
  496. ?>

Tags: PHP操作Mongodb

分享到: