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:123456@127.0.0.1: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
php 操作mongodb的更多相关文章
- mongoose - 让node.js高效操作mongodb
Mongoose库简而言之就是在node环境中操作MongoDB数据库的一种便捷的封装,一种对象模型工具,类似ORM,Mongoose将数据库中的数据转换为JavaScript对象以供你在应用中使用. ...
- 【MongoDB for Java】Java操作MongoDB
上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...
- PHP操作MongoDB学习笔记
<?php/*** PHP操作MongoDB学习笔记*///*************************//** 连接MongoDB数据库 **////*************** ...
- PHP操作Mongodb之增删改查篇
之前,我讲解过PHP中mongodb扩展的安装,及启动,链接操作[忘记了?去看看吧!PHP操作Mongodb之一].本文主要就是讲在PHP中Mongodb的增加,查询,修改及删除数据的操作. 1.增加 ...
- PHP操作Mongodb之高级查询篇
本文主要讲解PHP中Mongodb的除了增删改查的一些其他操作. 在PHP操作Mongodb之增删改查篇中我们介绍了PHP中Mongodb的增加.删除.修改及查询数据的操作.本文主要是将查询时用到的高 ...
- php操作mongodb中的ISODate格式日期
mongodb 中数据记录的日期格式为"dateCreated" : ISODate("2011-12-20T07:22:50.836Z")经过翻阅php官网中 ...
- nodejs操作mongodb
一.下载地址 https://www.mongodb.com/download-center#community 二.控制台操作mongodb 1.安装完后添加环境变量. 2.在某个根目录下新建dat ...
- nodejs操作mongodb数据库封装DB类
这个DB类也算是我经历了3个实际项目应用的,现分享出来,有需要的请借鉴批评. 上面的注释都挺详细的,我使用到了nodejs的插件mongoose,用mongoose操作mongodb其实蛮方便的. 关 ...
- Python 操作 MongoDB
原文 这篇文章主要介绍了使用Python脚本操作MongoDB的教程,MongoDB作为非关系型数据库得到了很大的宣传力度,而市面上的教程一般都是讲解JavaScript的脚本操作,本文则是基于Pyt ...
- Python 操作 mongodb 数据库
原文地址:https://serholiu.com/python-mongodb 这几天在学习Python Web开发,于 是做准备做一个博客来练练手,当然,只是练手的,博客界有WordPress这样 ...
随机推荐
- 1050. String Subtraction (20)
this problem is from PAT, which website is http://pat.zju.edu.cn/contests/pat-a-practise/1050. firs ...
- java_数组作缓存池的不可变类实例
package ming; public class CacheImmutale { private static int MAX_SIZE = 10; private static CacheImm ...
- javascript——马步之Array篇
数组 Array == 1.建立数组==* 通过变量赋值为[]来建立数组 var arr = []; // arr 是一个数组 * 需要注意数组的下标是从0开始中的 ==2.获取数组长度== * 通过 ...
- iOS “获取验证码”按钮的倒计时功能
iOS 的倒计时有多种实现细节,Cocoa Touch 为我们提供了 NSTimer 类和 GCD 的dispatch_source_set_timer方法去更加方便的使用计时器.我们也可以很容易的的 ...
- Update DN with Procedure
Update DN )) LANGUAGE SQL MODIFIES SQL DATA BEGIN -- Step 1 UPDATE DNRITM A SET (DNITTQTY, DNIREQTY) ...
- Mysql 中bitwise对效率的影响??
一直很疑惑,这个谁可以解释一下? 我也正在了解这方面的知识!
- webkit,HTML5头部标签
大家都知道在移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析html代码,更好地将移动web前端页面表现出来.本文整理一些HTML5头部<meta>标签常用的 ...
- java源码研究--List中的set和add方法区别
在处理一道题目是,发现他们使用了List 中的set 方法,这个方法我平时很少用到,今天来研究一下,set和add的区别 add(int index,Object obj)方法与set(int ind ...
- .NET微信支付(H5仅限公众号支付)
闲来无事,恰好有一个要用微信公众平台支付的功能,研究来研究去,就是要细心和多看腾讯提供的文档.当然有几个坑是很有必要说明一下的 公众号支付,这里统一叫H5支付,以下都是. 在做H5支付的时候,第一步就 ...
- SQL Server内存数据写入磁盘方法比较
众所周知,SQLServer增删改数据最先都是在内存中进行的,这可以大大加快数据操作的速度: 当内存中的数据被修改了,而磁盘中的数据还没有被修改时,就产生了所谓的“脏页”,SQLServer是如何同步 ...