码迷,mamicode.com
首页 > 数据库 > 详细

PHP操作MongoDB实例

时间:2015-09-09 17:45:23      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:

PHPmongodb扩展安装

1
2
3
4
5
6
# https://github.com/mongodb/mongo-php-driver/archive/master.zip
# unzip master.zip
# /usr/local/php/bin/phpize
# ./config --with-php-config=/usr/local/php/bin/php-config
# make
# make install

将mongo.so添加到php.ini

1
2
# vim /usr/local/php/etc/php.ini
extension = mongo . so

重启php-fpm生效

1
# /usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm.comf

php的mongodb扩展,提供了4个核心类接口
1). 针对mongodb的连接操作类MongoClient
http://www.php.net/manual/zh/class.mongoclient.php
2). 针对mongodb的数据库操作类MongoDB
http://www.php.net/manual/zh/class.mongodb.php
3). 针对mongodb的集合操作类MongoCollection
http://www.php.net/manual/zh/class.mongocollection.php
4). 针对mongodb的查询结果集(游标)操作类MongoCursor
http://www.php.net/manual/zh/class.mongocursor.php

连接MongoDB
mongodb驱动连接格式为:mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[database][?options]],如:
mongodb://localhost
mongodb://user:password@localhost
mongodb://user:password@localhost/database
mongodb://example1.com:27017,example2.com:27017
mongodb://localhost,localhost:27018,localhost:27019
mongodb://host1,host2,host3/?slaveOk=true
mongodb://localhost/?safe=true
mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000
mongodb://rs1.example.com:27017,rs2.example.com:27017/?replicaSet=myReplSetName
mongodb://localhost/?journal=true&w=majority&wTimeoutMS=20000
具体含义参见《ttlsa教程系列之mongodb—(一)mongodb介绍》 http://www.ttlsa.com/html/1594.html

PHP连接实例:

1
2
3
4
5
< ? php
$ m = new MongoClient ( "mongodb://localhost/?journal=true&w=majority&wTimeoutMS=20000" ) ;
$ m = new MongoClient ( "mongodb://rs1.example.com:27017,rs2.example.com:27017/?replicaSet=myReplSetName" ) ) ;
$ m = new MongoClient ( "mongodb://rs1.example.com:27017" , array ( "replicaSet" = > "myReplSetName" ) ) ;
$ m = new MongoClient ( "mongodb://rs1.example.com:27017,rs2.example.com:27017" , array ( "replicaSet" = > "myReplSetName" , "wTimeoutMS" = > 20000 ) ) ;

在连接到复制集时,用它来判断哪台是primary。返回主机名称、端口号、健康程度、状态(1-primary,2-secondary,0-other)、ping耗时、前一次ping的时间戳。

1
$ m -> getHosts ( ) ;

列出所有数据库,返回数据库名称、大小、是否为空以及总大小、ok状态。

1
$ m -> listDBs ( ) ;

选择数据库,返回数据库对象

1
2
3
$ db = $ m -> db_name ;
$ db = $ m -> selectDB ( db_name ) ;

选择表(集合),返回文档集合对象

1
2
3
4
5
$ col = $ m -> selectCollection ( db_name , col_name ) ;
$ col = $ m -> selectDB ( db_name ) -> selectCollection ( col_name ) ;
$ col = $ m -> db_name -> col_name ;

列出所有集合,返回集合对象

1
$ col_list = $ db -> listCollections ( ) ;

获取当前选择的数据库名,返回数据库名

1
$ db_name = $ db -> __toString ( ) ;

删除当前数据库

1
$ db -> drop ( ) ;

设置slaveok状态(可读状态设置)

1
$ db -> setSlaveOkay ( true / false ) ;

获取slaveok当前状态

1
$ db -> getSlaveOkay ( ) ;

插入数据MongoCollection::insert(array $a,array $options)
array $a 要插入的数组
array $options 选项:safe 是否返回操作结果信息;fsync 是否直接插入到物理硬盘;w 写入份数;timeout 超时时间

1
2
3
4
5
< ? php
$ coll = $ m -> db_name -> col_name ;
$ a = array (website ‘=>’www.ttlsa.com‘ ) ;
$ options = array (safe= > true ) ;
$ rs = $ coll -> insert ( $ a , $ options ) ; $ rs为数组,包含操作信息

删除集合中的记录MongoCollection::remove(array $criteria,array $options)
array $criteria 条件
array $options 选项: safe 是否返回操作结果; fsync 是否是直接影响到物理硬盘; justOne 是否只影响一条记录

1
2
3
4
5
< ? php
$ coll = $ m -> db_name -> col_name ;
$ c = array (website ‘=>‘ www . ttlsa . com,hit= > array ($ lt= > 100 ) ) ;
$ options = array (safe= > true ) ;
$ rs = $ coll -> remove ( $ c , $ options ) ; $ rs为数组,包含操作信息

更新集合中的记录MongoCollection::update(array $criceria,array $newobj,array $options)
array $criteria 条件
array $newobj 要更新的内容
array $options 选项: safe 是否返回操作结果; fsync 是否是直接影响到物理硬盘; upsert 是否没有匹配数据就添加一条新的; multiple 是否影响所有符合条件的记录,默认只影响一条

1
2
3
4
5
6
< ? php
$ coll = $ m -> db_name -> coll_name ;
$ c = array (uid ‘=>888,’login_count’=>array(’$lt’=>100));
$newobj = array(’vip‘ = >1 ‘,’score‘ = >10000) ;
$ options = array (safe= > true ,multiple= > true ) ;
$ rs = $ coll -> remove ( $ c , $ newobj , $ options ) ; $ rs为数组,包含操作信息

查询集合获取单条记录MongoCollection::findOne(array $query,array $fields)
array $query 条件
array $fields 要获得的字段

1
2
3
4
5
< ? php
$ coll = $ m -> db_name -> col_name ;
$ query = array (score= > array ($ lt= > 10000 ) ) ;
$ fields = array (uid ‘=>true,’vip‘ = > true ) ;
$ rs = $ coll -> findOne ( $ query , $ fields ) ; 返回 arraynull

获取多条记录MongoCollection::find(array $query,array $fields)
array $query 条件
array $fields 要获得的字段

1
2
3
4
5
6
< ? php
$ coll = $ m -> db_name -> col_name ;
$ query = array (s= > array ($ lt= > 100 ) ) ;
$ query = array (score= > array ($ lt= > 10000 ) ) ;
$ fields = array (uid ‘=>true,’vip‘ = > true ) ;
$ rs = $ coll -> find ( $ query , $ fields ) ; 返回游标对象 MongoCursor

获取查询结果数量

1
2
$ cursor = $ coll -> find ( ) ;
$ num = $ cursor -> count ( ) ;

选定列MongoCursor::fields

1
2
3
$ cursor -> fields ( array ( column_name1 = > true , column_name2 = > false ) ) ;
$ cursor = $ coll -> find ( ) -> fields ( array ( column_name1 = > true , column_name2 = > false ) ) ;

分页

1
$ cursor = $ coll -> find ( ) -> limit ( 30 ) -> skip ( 0 ) ;

排序MongoCursor::sort

1
$ cursor = $ coll -> find ( ) -> sort ( array ( column_name1 = > - 1 , column_name2 = > 1 ) ) ;

取查询结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cursor = $ coll -> find ( $ query , $ fields ) ;
while ( $ cursor -> hasNext ( ) ) {
     $ r = $ cursor -> getNext ( ) ;
     var_dump ( $ r ) ;
}
或者
$ cursor = $ coll -> find ( $ query , $ fields ) ;
$ r = array ( ) ;
foreache ( $ cursor as $ k = > $ v ) {
     var_dump ( $ v ) ;
     $ r [ ] = $ v ;
}
或者
$ cursor = $ coll -> find ( $ query , $ fields ) ;
$ array = iterator_to_array ( $ cursor ) ;

快照MongoCursor::snapshot
保证一致性。在做find()操作时,获得$cursor之后,这个游标是动态的,在循环取结果过程中,如果有其他连接来更改符合条件的记录时,这个$cursor也会跟着变化的。$cursor->snapshot();之后,再插入或删除符合条件的记录时,获取的结果集将不再变化。如果是小于1M的结果集会自动被当作snapshot来处理。
如果要获取$cursor之后不变的结果需要这么做:

1
2
$ cursor = $ coll -> find ( $ query , $ fields ) ;
$ cursor -> snapshot ( ) ;

snapshot对findOne无效。

PHP操作MongoDB实例

标签:

原文地址:http://my.oschina.net/u/247923/blog/503848

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!