分享一个Mongodb PHP封装类


<?php
/**
* Mongodb 基本操作API,支持基本类似关系统型数据库的操作接口
*
* @version 1.0
* [说明]
*
* 1:该版本API实现了 Mongodb 中最基本的插入/修改/查询/删除操作的封装
* 2:其它更高级的操作可通过 $this->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,5,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,2,3,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 数据,如: array('id'=>1,'name'=>'name1')
* @param boolean $safe 是否安全操作 false:不等待服务器的响应直接返回 true:等待服务器的响应(数据非常重要时推荐)
* @param boolean $fsync 操作后是否立即更新到碰盘,默认情况下由服务器决定
*
* @return boolean
*/
public function save($colName, $sets, $safe=false, $fsync=false){
// 处理 '_id' 字段
$sets = $this->_parseId($sets);
$ret = $this->_getCol($colName)->save($sets,array('w'=>$safe,'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,$safe=false,$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)), array('id'=>1), 'pop');
* 解说:删除 id=1 的记录中 comm 对应的文档集合中 'commid'=>1 对应的文档.
*
* 'unset':在文档中删除指定的键
* 示例:update('user', array('name'=>1), array('id'=>1), 'unset');
* 解说: 将 user 集合中将 id=1 对应的文档中的 name 字段删除
*
* 'pull':删除文档中匹配其值的键
* 示例:update('user', array('name'=>'youname'), array('id'=>1), 'pull');
* 解说:将 user 集合中将 id=1 对应的文档中的 name='youname' 的字段删除
*
* 'addToSet':如果值不存在就添加(避免重复添加)
* 示例:update('user', array('names'=>'youname'), array('id'=>1), 'addToSet');
* 解说:向 user 集合中 id=1 对应的文档中的 names 字段添加 'youname' 这个值(不存在时才添加)
*
* 'replace':用 $newDoc 新文档替换 $query 所找到的文档
* 示例:update('user', array('newid'=>1,'newnames'=>'name1'), array('id'=>1), '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,$query=array(),$option='set',$upAll=true,$upsert=false,$safe=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,
'w' => $safe,
'fsync' => $fsync,
);
return $col->update($query,$newDoc,$options);
} /**
* 查询文档集,返回二维数组
*
* 说明:
* 1:类似mysql中的 select * from table
*
* 示例:select('user');
* 类似:select * from user;
*
* 示例:select('user',array('id','name'));
* 类似:select id,name from user;
*
* 示例:select('user',array('id','name'),array('id'=>1));
* 类似:select id,name from user where id=1;
*
* 示例:select('user',array('id','name'),array('id'=>1),array('num'=>1));
* 类似:select id,name from user where id=1 order by num asc;
*
* 示例:select('user',array('id','name'),array('id'=>1),array('num'=>1),10);
* 类似:select id,name from user where id=1 order by num asc limit 10;
*
* 示例:select('user',array('id','name'),array('id'=>1),array('num'=>1),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,$query=array(),$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,$query=array(),$limit=0,$skip=0){
return $this->_getCol($colName)->count($query,$limit,$skip);
} /**
* 返回集合中的一条记录(一维数组)
*
* @param string $colName 集合名
* @param array $query 查询条件,具体请看 [查询条件说明文档]
* @param array $fields 结果集返回的字段, array():表示返回所有字段 array('id','name'):表示只返回字段 "id,name"
*
* @return array
*/
public function fetchRow($colName,$query=array(), $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,$query=array(), $fields='_id'){
$ret = $this->fetchRow($colName,$query,array($fields));
return isset($ret[$fields]) ? $ret[$fields] : false;
} /**
* 返回查询文档集合集中指定字段的值(一维数组)
*
* @param string $colName 集合名
* @param array $query 查询条件,具体请看 [查询条件说明文档]
* @param string $fields 要取其值的字段,默认为 "_id" 字段,类似mysql中的自增主键
*
* @return array
*/
public function fetchCol($colName,$query=array(), $fields='_id'){
$result = array();
$list = $this->select($colName,$query,array($fields));
foreach ($list as $row){
$result[] = $row[$fields];
}
return $result;
} /**
* 返回指定下标的查询文档集合(二维数组)
*
* @param string $colName 集合名
* @param array $query 查询条件,具体请看 [查询条件说明文档]
* @param string $fields 要取其值的字段,默认为 "_id" 字段,类似mysql中的自增主键
*
* @return array
*/
public function fetchAssoc($colName,$query=array(), $fields='_id'){
$result = array();
$list = $this->select($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
?>

Mongodb PHP封装类的更多相关文章

  1. 分享一个Mongodb PHP封装类

    <?php /** * Mongodb 基本操作API,支持基本类似关系统型数据库的操作接口 * * @version 1.0 * [说明] * * 1:该版本API实现了 Mongodb 中最 ...

  2. 【MongoDB】 基于C#官方驱动2.2版的封装类

    一.前言 最近项目中要用到MongoDB,因此实现做了不少的调研.发现网上很多现有关于MongoDB C#官方驱动的调用方法都是基于1.8版本的,已经不是用了最新的2.2版本.因此我在基于C#官方驱动 ...

  3. mongodb 操作类

    在使用这个类之前,建议先自己去写,把方法都了解了再用,这样你就可以在适当的时候修个此类,另外请自己构建PagerInfo using System; using System.Collections. ...

  4. mongoDB操作命令及mongoDB的helper

    此项目已开源,开源地址是: http://mongodbhelper-csharp.googlecode.com/svn/trunk/ mongodb的helper using System; usi ...

  5. C/C++ 开源库及示例代码

    C/C++ 开源库及示例代码 Table of Contents 说明 1 综合性的库 2 数据结构 & 算法 2.1 容器 2.1.1 标准容器 2.1.2 Lockfree 的容器 2.1 ...

  6. MongoDbHelper 帮助类(下)

    对MongoDbHelper帮助类进行了一下整合,但是代码中一个方法需要将string类型转化为BsonValue类型一直出错.所以欢迎留言指正 using System; using System. ...

  7. MongoDbHelper 帮助类(上)

    在网上搜索mongodbHelper的帮助类时,出来的东西都大同小异,再此摘录一下. 这些代码也看了一遍,总是感觉重复的代码太多了,在后续的文章中又整合了一下,请看下篇,欢迎指正! using Sys ...

  8. MongoDB的C#封装类

    代码: samus驱动 using System; using System.Collections.Generic; using System.Linq; using System.Text; us ...

  9. Mongodb Manual阅读笔记:CH4 管理

    4 管理 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...

随机推荐

  1. 调试 Ingress Nginx

    由于 Ingress Nginx 是最受欢迎的 Ingress 控制器,因此接下来我们将介绍一些有关调试 ingress-nginx 的技巧. 调试 Ingress Nginx Ingress-ngi ...

  2. 远程调试在Linux车机中的应用

    导读 在软件开发过程中,调试是必不可少的环节,嵌入式操作系统的调试与桌面操作系统的调试相比有很大差别,嵌入式系统的可视化调试能力比桌面操作系统要弱一点.对于导航这种业务场景比较复杂的程序开发,可视化调 ...

  3. JS获取时间(当前-过去-未来)

    /** * 获取时间格式为:1970-01-01 00:00 * @param {参数} params * 属性 类型 默认值 必填 说明 * date Date new Date() 否 Date对 ...

  4. javascript 数据结构与算法---二叉数

    二叉树,首先了解一些关于二叉数的概念(来自百度百科) 1. 二叉树(Binary tree)是树形结构的一个重要类型 2. 定义: 二叉树(binary tree)是指树中节点的度不大于2的有序树,它 ...

  5. [NOIP2018]保卫王国 题解

    NOIP2018提高组D2T3 ddp虽然好想,但是码量有点大(其实是我不会),因此本文用倍增优化树形DP来解决本题. 题意分析 给一棵树染色,每个节点染色需要一定的花费,要求相邻两个节点至少要有一个 ...

  6. 分享一个操作pdf文件的js文件-pdfObject.js(文件预览、下载、打印等操作都具备)

    获取相关资料或者源码的朋友可以关注下公众号,回复关键字pdf20200518即可

  7. 2个案例带你快速实现Response返回值

    今天先来学习一下Response的相关知识. 所有返回前台的内容其实都应该是Response的对象或者其子类,我们看到如果返回的是字符串直接可以写成return u'字符串内容'的形式,但是其实这个字 ...

  8. gdb我在我本机上p不了,在别人机子上可以

    gdb我在我本机上p不了,在别人机子上可以,不知道什么 (gdb) p EventFlow->devicetypeThere is no member or method named devic ...

  9. ES6--let,解构赋值,promise && ES7--async

    ES-->IE10.Google.火狐 ES6 let 声明的关键字 不能重复声明 块级作用域 <input type="button" value="1&q ...

  10. 《神经网络的梯度推导与代码验证》之FNN(DNN)前向和反向过程的代码验证

    在<神经网络的梯度推导与代码验证>之FNN(DNN)的前向传播和反向梯度推导中,我们学习了FNN(DNN)的前向传播和反向梯度求导,但知识仍停留在纸面.本篇章将基于深度学习框架tensor ...