随着big data时代的到来,单纯的关系型数据库已经不能满足海量数据的查询要求了。近几年,NoSQL数据库异常火爆,是用于处理大数据的利器。
关于MongoDB的介绍有很多,这里不再赘述,只是讲解其核心的BSON,就是二进制的JSON,在没有特殊说明的情况下,就可以看成是JSON,语法类似
{name: 'csdn',post: [{'title': 'blog',content: 'this is a blog'},{'title': 'space', 'content': 'this is a space'}]}, 和PHP的关联数组是对应的,而且可以看到post的最外层也是一个数组,可以等价于
array(
array('title' => '', 'content' => ''),
array('title' => '', 'content' => '')
)
所以上面的JSON等价于PHP里面的多位数组:
array(
'name' => 'csdn',
'post' => array(
array('title' => '', 'content' => ''),
array('title' => '', 'content' => '')
)
)
有了上面的基础,就可以开始下面的学习了。
1 连接mongodb
连接的时候不能简单的使用超级管理员的权限连接,这个涉及到一个mongodb的授权问题,需要给每个数据库创建用于权限,例如要给test用户创建一个root用户:
use test; // switch database
db.addUser('root','123');
db.auth('root', '123');
在mongodb的模式下创建用户,然后断开当前的超级管理员连接,使用创建的账号连接到test数据库
mongo -uroot -p123 localhost:27017/test
在使用php进行连接时候:
$mongo = new Mongo(); // 超级管理员连接方式,不起作用了,因为当前的启动方式不是超级管理员方式
$mongo = new Mongo("mongodb://{$username}:{$password}@localhost:27017/test");
因为最后的操作都是在collection(相当于table)中进行,首先要选择DB和Collection。可以使用API selectDB , selectCollection
2 insert 数据到mongodb
从html表单中post数据到PHP中进行处理,这里过滤掉一些验证,介绍核心部分。 首先需要构建交错数组
$info['user'] = $_POST['user'];
$post['title'] = $_POST['title'];
$post['content'] = $_POST['content'];
$info['post'] = array($post);
这样就构建了前面提到的数据的形式,然后就可以进行插入数据 insert($info)。这样就解决insert的问题,但是马上另一个问题又出现了,如果相同user的数据又post到PHP中了,按照上面的逻辑,就应该再添加一条记录,这显然是不合适的,同一个user提交的content应该归档在一下(这里不考虑一些用户的同名),那么对应的就应该是update而不是insert了,就是向上面json中post: [{}],添加一个{} 变成post:[{}, {}] , 需要向[] 中push一个{}。
mongodb的update操作比较复杂,有很多魔术方法,push就是其中一个,概念从javascript中而来,语法如下
update({}, {$push:{post: {} } })
第一个{} 是要查找更新的数据。
有了上面的讲解,就应该首先判断user是否已经存在:
find(array('user'=>$info['user']))->count()==0
不存在就insert,存在就update:
$push = array();
$push['$push'] = array('post'=>$post);;
update(array('user'=>$info['user']),$push)
这样就可以将相同用户提交的内容归类在一起。
3 遍历显示
由于数据嵌套的层次较深,需要使用多个loop进行,效率方面暂时不考虑(可以再mongodb中使用index)。
首先要获取结果集的一个cursor,然后使用cursor进行外层遍历:
while($cursor->hasNext()){ $cur = $cursor->getNext(); }
这样就获取了上面提到的那个PHP数据,接下来怎么遍历,方法就比较多了,重点讲下post的遍历,post对应一个二维数组,外层是数字索引
$cnt = count($value);$i=0;
while($i<$cnt){
$p = $value[$i];
foreach($p as $k=>$v){
}
}
这样就可以遍历得到title和content的内容
以上简单介绍了一些基本的PHP操作mongodb,欢迎拍砖。