以前都是玩mysql的,从这周开始接触mongoDB,并且用php查了一波mongoDB。其实和mysql差不多,只是换了一个数据库,所以查询语句的写法不一样。在这里简单总结一下。

一、mongoDB

mysql是关系数据库,mongoDB是非关系数据库,nosql(not only sql 我以前一直以为就是 no-sql)。

mongodb怎么查看已有用户名密码_mongodb怎么查看已有用户名密码



mongoDB特点(这部分是慕课网的视频课程我做的笔记,我觉得讲的还是比较清楚。)

1. 没有数据结构的限制

(1)没有表结构的概念,每条记录可以有完全不同的结构

(2)业务开发方便快捷

(3)sql数据库要事先定义表结构再使用

2. 完全的索引支持

(1)redis只能按键查询key-value

(2)hbase的单索引,二级索引需要自己构建

而mongoDB支持单键索引、多键索引、数组索引、全文索引、地理位置索引等。


3. 方便的冗余和扩展

(1)复制集保证数据安全

(2)分片扩展数据规模


4. 良好的支持

完善的文档和齐全的驱动

二、php操作mongoDB

对于mongoDB的了解也就仅限于此。接下来的任务就是用php操作mongoDB,这里主要涉及的是简单的查询。

这次的学习有点急功近利,就想着赶紧学会用,根本没有对mongoDB有一个很系统、很深入的了解。(当然时间不允许啦,不然强迫症的我估计会从头学起啊。)

php操作mongoDB,我是从另外的一个教程学习的,现在把地址贴在这。

mongoDB PHP 教程

我本以为这样就可以顺利完成任务,其实我还是图样。

这样讲没什么意思,我还是上代码吧。

<?php 

// connect
$m = new MongoClient();

// select a database
$db = $m->HT_Email;

// select a collection (analogous to a relational database's table)
$collection = $db->Email;

$cc= isset($_REQUEST['cc'])?($_REQUEST['cc']):"";
$from = isset($_REQUEST['from'])?($_REQUEST['from']):"";
$to = isset($_REQUEST['to'])?($_REQUEST['to']):"";
$attach = isset($_REQUEST['attach'])?($_REQUEST['attach']):"";
$subject = isset($_REQUEST['subject'])?($_REQUEST['subject']):"";

//where
$query = array();
if (!empty($cc)) {
  $query = array_merge(array('cc_user'=>new MongoRegex("/.*".$cc.".*/i")),$query);
}
if (!empty($from)) {
  $query = array_merge(array('from_user'=>new MongoRegex("/.*".$from.".*/i")),$query);
}
if (!empty($to)) {
  $query = array_merge(array('to_user'=>new MongoRegex("/.*".$to.".*/i")),$query);
}
if (!empty($attach)) {
  $query = array_merge(array('attachments'=>new MongoRegex("/.*".$attach.".*/i")),$query);
}
if (!empty($subject)) {
  $query = array_merge(array('subject'=>new MongoRegex("/.*".$subject.".*/i")),$query);
}

//page
  $pagesize = 10; //每页显示的数据条数
  $page = isset($_GET['page'])?intval($_GET['page']):1;  //获取页数信息
  $offset = ($page - 1) * $pagesize;  //偏移量( //获取limit的第一个参数的值 offset ,假如第一页则为(1-1)*10=0,第二页为(2-1)*10=10。 (传入的页数-1) * 每页的数据 得到limit第一个参数的值)
  $total = $collection->find($query)->skip(0)->count(true);
  $pagenum = ceil($total/$pagesize);  //获得总页数

  if ($page<1) {
    $page=1;
  }

  if ($page>$pagenum){
    $page= $pagenum;
  }

  if($page<10){
    $start =1 ;
    $end = 9;
  }
  elseif ($page>=10 && $page<($pagenum-9+1)) 
  {
    $start =$page -4;
    $end = $page +4;
  }
  elseif ($page>=($pagenum-9+1)) 
  {
    $start= $pagenum-9+1;
    $end = $pagenum;
  }
  $pre= $page-1;
  $next= $page+1;

  $page_params = "&from=$from&to=$to&subject=$subject&cc=$cc&attach=$attach";

//find
$cursor = $collection->find($query)->limit($pagesize)->skip($offset);

?>

代码都有注释,我还是简单解释一下我研究这一段的心路历程。

刚开始就是连接数据库啊,这里因为web和mongoDB在一台服务器上,所以直接省略了参数。

选择数据库和集合。

接下来就是接收前端页面传来的参数。这里不用说了吧,input的name和php的request对应。

然后写查询条件,在sql里就是where。

首先判断你有没有接收到参数,如果非空,开始写条件。

mongoDB的条件是写在一个数组中,你要查哪个字段,值是什么。

这里的MongoRegex是用来模糊匹配的。

array_merge是数组的合并,用来实现多条件查询。

接下来是分页,这个之前讲过。需要注意的是$total的计算。就要用到mongoDB统计的语法count()。

还要注意的一点就是,要写翻页参数。

查询语句是find。把我们刚才构造好的查询条件当做参数就好了。

翻页的查询语句是用limit和skip来实现的。这里类比mysql的limit  $pagesize,$offset 很容易理解。

翻页显示页数的代码和mysql一样,这里就不写了。