php 操作mongodb
在这里首先说一下mongo 客户端安装完成有时会启动失败 这里解决办法就是 删除 D:\mongodb\db 下的 mongod.lock文件即可 再重新启动
首先下载mongodb php扩展
5.3 mongo driver下载:
更多版本 https://github.com/mongodb/mongo-php-driver/downloads
http://downloads.mongodb.org/mongo-latest-php5.3vc6ts.zip
把DLL复制到extension目录,然后 如我安装时wamp集成环境 我得扩展目录是 E:\wamp\bin\php\php5.4.16\ext
接下来我们修改php.ini 如我的目录:E:\wamp\bin\php\php5.4.16\php.ini 添加 extension=php_mongo.dll即可
接下来就是操作mongodb了 :我这以我的程序为例
这里我的程序使用框架是yii
您不必理会框架本身
<?php header("Content-type:text/html;charset=utf-8;"); class CommentController extends Controller { public $layout = false; /** * Mongodb 连接句柄 * * @var $conn */ public $conn; /** * 评论表空间 * * @var $collection */ public $collection; /** * 关系表空间 * * @var $commentIndex */ public $commentIndex; /** * 评论关系总表 结果集 * * @var $relation */ private $relation; /** * 加工后关系列表 * * @var $relation_list */ private $relation_list = array (); /** * page 当前页数 * * @var $page */ public $page = 1; /** * limit 最大页码数 * * @var $limit */ public $limit = 10; /** * query 关键词搜索 * * @var $query */ public $query; /** * yii pageObject */ public $pageObject = NULL; /** * 删除关系list * * @var $deletelist */ private $deletelist = array (); /** * 删除关系result * * @var $result */ private $result = array (); /** * 评论总数 * * @var $c_count */ public $c_count; /** * Log 日志 * * @var $Log */ private $Log = NULL; /** * cArrayDataProvider * * @var cArrayDataProvider */ public $cArrayDataProvider = NULL; /** * @初始化应用数据 */ public function init() { $this->layout = false; parent::init (); $this->mongoInit (); ini_set ( ‘memory_limit‘, ‘1024M‘ ); $this->page = Yii::app ()->request->getParam ( ‘page‘, $this->page ); $this->limit = Yii::app ()->request->getParam ( ‘limit‘, $this->limit ); } /** * 数据库初始化,正式项目在配置文件中生成 * @mongodb */ public function mongoInit() { try { $this->conn = new MongoClient ( Yii::app ()->params [‘host‘] ); $this->collection = $this->conn->selectCollection ( Yii::app ()->params [‘database‘], Yii::app ()->params [‘comment‘] ); $this->commentIndex = $this->conn->selectCollection ( Yii::app ()->params [‘database‘], Yii::app ()->params [‘commentIndex‘] ); } catch ( MongoConnectionException $e ) { exit ( ‘<p>Couldn\‘t connect to mongodb, is the "mongo" process running?</p>‘ ); } } /** * Lists all models. */ public function actionIndex() { $this -> c_count = $this->collection->count (); if ($this -> c_count) { $this->getCommentItem ( $this -> c_count ); //$data = array(‘pages‘ => $this->pageObject, ‘total‘ => $this->c_count, ‘countPage‘ => $countPage); } else { //$data = array (‘pages‘ => $this->pageObject, ‘total‘ => 0, ‘countPage‘ => 0); } $this->render(‘list‘); } /** * load CArrayDataProvider */ protected function cArrayDataProvider(){ $this -> cArrayDataProvider = new CArrayDataProvider($this -> relation_list,array( ‘keyField‘=>false, )); return $this -> cArrayDataProvider; } /** * 评论的所有数据集 * * @throws Excepition */ public function getCommentItem($count) { $this->cPagination ( $count ); $page = ($this->page - 1) * $this->limit; $rows = $this->collection->find ()->sort ( array (‘_id‘ => - 1 ))->limit ( $this->limit )->skip ( $page ); $this->relation_list = $this->_page ( $rows ); $this -> cArrayDataProvider(); return $this->relation_list; } /** * yii分页 * * @param * $count */ protected function cPagination($count = 0) { $criteria = new CDbCriteria (); $pager = new CPagination ( $count ? $count : $this->c_count ); $pager->pageSize = $this->limit; $pager->applyLimit ( $criteria ); $this->pageObject = $pager; return $this->pageObject; } /** * 关键词搜索 */ public function actionSearch() { $k = Yii::app ()->request->getParam ( ‘k‘, NULL ); if (empty ( $k )) { Yii::app ()->user->setFlash ( ‘error‘, "搜索关键词为空!" ); $this->redirect ( Yii::app ()->request->urlReferrer ); } $this->query = array ("comment" => new MongoRegex ( "/{$k}/" ) ); $this -> c_count = $this->collection->find ( $this->query )->count (); if ($this -> c_count) { $this->cPagination ( $this -> c_count ); } $page = ($this->page - 1) * $this->limit; $rows = $this->collection->find ( $this->query )->sort(array(‘_id‘ => -1))->limit ( $this->limit )->skip ( $page ); $this->relation_list = $this->_page ( $rows ); $this -> cArrayDataProvider(); $this->render(‘list‘); } /** * 数据集处理 * * @param array $rows * @param boolean $handle */ protected function _page($rows, $handle = false) { $rows_list = array (); foreach ( $rows as $val ) { $rows_list [] = $val; } unset ( $rows ); if (! $handle) { return $rows_list; } return array_slice ( $rows_list, ($this->page - 1) * $this->limit, $this->limit ); } /** * 用于构造提示信息的主体 * $word 分类 * $tip 提示信息 * $color blue or red * */ protected function dialogContent($word,$tip,$color) { switch($color) { case ‘red‘: $str = ‘<p>‘.$word.‘<font style="color:red">‘.$tip.‘</font></p>‘; break; case ‘blue‘: $str = ‘<p>‘.$word.‘<font style="color:blue">‘.$tip.‘</font></p>‘; break; default: $str = ‘<p>‘.$word.‘<font style="color:blue">‘.$tip.‘</font></p>‘; break; } return $str; } /** * 删除评论 */ public function actionRemove() { $data = Yii::app ()->request->getParam ( ‘data‘, NULL ); if (empty ( $data )) { exit($this -> dialogContent(‘批量删除‘, ‘数据有问题!‘, ‘red‘)); } if (is_array ( $data )) { foreach ( $data as $k => $v ) { try { $this->collection->remove ( array (‘_id‘ => ( object ) new MongoId ( $v[‘_id‘] ) ) ); $this->delCommentRelation ( ‘0883B740-C3AE-8EF0-C03E-15128FEF6142‘, $v [‘id‘] ); //增加日志 $this->Log = new Log; //解决批量插入问题 date_default_timezone_set(‘PRC‘); //设置时区 $operate_id = 2; $this->Log->attributes = array( ‘operate_id‘ => $operate_id, //操作人id ‘uid‘ => 2, //用户uid ‘type‘ => ‘删除‘, //日志类型 删除 ‘date‘ => date(‘Y-m-d H:i:s‘, time()), //操作时间 ‘detail‘ => ‘操作人:‘.$operate_id.‘删除了帖子id:‘.$v [‘id‘] //详细 ); $this->Log->save(); } catch ( Exception $e ) { echo $e->getMessage () . ‘<br>‘ . $e->getFile () . ‘<br>‘ . ‘第‘ . $e->getLine () . ‘行<br>‘; } } unset ( $data ); } else { throw new Exception ( ‘删除数据有问题,请查看程序‘ ); } exit($this -> dialogContent(‘批量删除‘, ‘删除评论成功!‘, ‘blue‘)); } /** * 删除关系入口 * * @param int $id * @param int $delid */ public function delCommentRelation($id, $delid) { $this->query = array (‘_id‘ => $id ); $this->relation = $this->commentIndex->findOne ( $this->query ); $this->relation_list = $this->relation [‘index‘]; foreach ( $this->relation_list as $value ) { $this->deletelist [] = array_diff ( explode ( ‘_‘, $value ), array ($delid ) ); } $this->deleteRelation ( $id ); } // 删除关系 public function deleteRelation($id) { foreach ( $this->deletelist as $key => $value ) { if (! empty ( $value )) { $this->result [] = implode ( ‘_‘, $value ); } } $this->result = array_unique ( $this->result ); // 楼层唯一性显示 $this->c_count = count ( $this->result ); $this->updateRelation ( $id ); } // 更新 public function updateRelation($id) { $set = array (‘index‘ => $this->result, ‘count‘ => $this->c_count ); $this->commentIndex->update ( array ("_id" => $id ), array (‘$set‘ => $set ) ); // 更新完成销毁变量 $this->deletelist = $this->result = array (); } }
这里进行说明一下
/**
*
数据库初始化,正式项目在配置文件中生成
* @mongodb
*/
public function mongoInit() {
try {
$this->conn = new MongoClient (
"mongodb://php:[email protected]:27017/comment"); 这里连接方式是授权方式
数据库是comment
$this->collection = $this->conn->selectCollection ( "comment",
"comment"); //数据库comment 集合相当于表 comment
$this->commentIndex =
$this->conn->selectCollection ("comment", "commentIndex");
//数据库comment 集合相当于表 commentIndex
} catch ( MongoConnectionException $e ) {
exit ( ‘<p>Couldn\‘t connect
to mongodb, is the "mongo" process running?</p>‘ );
}
}
//链接方法有很多如:
//*************************
//** 连接MongoDB数据库 **//
//*************************
//格式=>(“mongodb://用户名:密码
@地址:端口/默认指定数据库”,参数)
$conn
=
new
Mongo();
//可以简写为
//$conn=new
Mongo(); #连接本地主机,默认端口.
//$conn=new
Mongo(“172.21.15.69″); #连接远程主机
//$conn=new
Mongo(“xiaocai.loc:10086″); #连接指定端口远程主机
//$conn=new
Mongo(“xiaocai.loc”,array(“replicaSet”=>true)); #负载均衡
//$conn=new
Mongo(“xiaocai.loc”,array(“persist”=>”t”)); #持久连接
//$conn=new
Mongo(“mongodb://sa:123@localhost”);
#带用户名密码
//$conn=new
Mongo(“mongodb://localhost:27017,localhost:27018″);
#连接多个服务器
//$conn=new
Mongo(“mongodb:///tmp/mongo-27017.sock”);
#域套接字
//$conn=new
Mongo(“mongodb://admin_miss:miss@localhost:27017/test”,array(‘persist’=>’p‘,”replicaSet”=>true));
#完整
这里是初始化mongodb
接下来就是操作了
插入comment数据:
$postData = array
(
‘id‘ => 1,
‘author‘ =>
‘作者‘,
‘comment‘ => ‘内容‘,
‘date‘ => new MongoTimestamp (), //插入时间 这个是mongo的类
‘type‘ => ‘blog‘, //类型
);
$this->comment->insert ( $postData);
-----------------------------------------------------------------------------------
查询所有数据:
$result = $this -> comment -> find();
这里获取$result 是mongo结果集 不是二维数组
foreach($result as $k => $v){
var_dump($v); //打印数据
}
---------------------------------------------------------------------------------
查询数据带条件
$query = array(‘type‘ => ‘blog‘, ‘id‘ => 1); //查询 type 为blog的 并且id为1的
$result = $this -> comment -> find($query);
这里获取$result 是mongo结果集 不是二维数组
foreach($result as $k => $v){
var_dump($v); //打印数据
}
---------------------------------------------------------------------------------------------
查询数据带条件 分页
$query = array(‘type‘ => ‘blog‘, ‘id‘ => 1); //查询 type 为blog的 并且id为1的
$result = $this -> comment -> find($query) ->limit ( 最大页码数 ) -> skip(跳过的页数); 这里是取出前十条记录 skip是跳过多少行 limit是取出多少
跳过的页数 = (当前页数 -1)* 最大页码数
这里获取$result 是mongo结果集 不是二维数组
foreach($result as $k => $v){
var_dump($v); //打印数据
}
----------------------------------------------------------------------------------------------------
查询数据带条件 分页 排序
$query = array(‘type‘ => ‘blog‘, ‘id‘ => 1); //查询 type 为blog的 并且id为1的
$result = $this -> comment -> find($query) ->limit ( 最大页码数 ) -> skip(跳过的页数)-> sort(array(‘_id‘ => -1)); //这里_id是mongo自动生成的
1正序 -1 倒序
这里是取出前十条记录 skip是跳过多少行 limit是取出多少
跳过的页数 = (当前页数 -1)* 最大页码数
这里获取$result 是mongo结果集 不是二维数组
foreach($result as $k => $v){
var_dump($v); //打印数据
}
------------------------------------------------------------------------------------------------------------------
取出一个表的总数
$count= $this -> comment ->count();
echo $count;
------------------------------------------------------------------------------------------------------------------
取出一个表的总数 带条件
$query = array(‘id‘ => 1);
$count= $this -> comment ->find($query) -> count();
echo $count;
-----------------------------------------------------------------------------------------------------------------------------------
查询一条数据
$id = ‘mongoid‘;
$query = array(‘_id‘ => ( object ) new MongoId($id));
$findOne= $this -> comment ->findOne($query);
---------------------------------------------------------------------------------------------------------------------------------
删除数据
$id = ‘mongoid‘;
$query = array(‘_id‘ => ( object ) new MongoId($id));
$findOne= $this -> comment ->remove($query);
---------------------------------------------------------------------------------------------------------------------------------
修改数据
$id = ‘mongoid‘;
$where = array(‘_id‘ => ( object )
new MongoId($id));
$updateData =
array(‘$set‘ => array(‘comment‘ => ‘修改内容‘));
$result = $this -> collection -> update($where,
$updateData);
return $result[‘updatedExisting‘]; 成功返回 true 失败 false
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。