最近在学习mongo,做一点总结:
1.用php连接mongodb:
$client = new MongoClient();//连接mongodb,构造函数可以有参数,默认连接mongodb://localhost:27017,得到了一个连接对象
$client = new Mongo();也是连接mongodb,但是该类已经过时,使用会给出小错误,不建议使用
2.连接对象支持的操作简介:
$client->close();关闭连接
$client->selectDB(DBName);选择数据库DBName,如果不存在就抛出异常。类似mysql连接后需要选库一样
$client->listDBs();查看当前连接下有多少个数据库
$client->dropDB();删除一个数据库,但是已经废弃
$client->getCollections()获取连接信息
还有其他一些支持的方法和属性,详见php文档........
3.选库:
$db = $client->selectDB('mydb');选择mydb库
$db = $client->mydb;选择mydb库,和上面一样都是返回一个$db对象
$db->listCollections();列出当前db下有哪些集合
$col = $db->createCollection('aaa');创建集合aaa,并返回集合对象$col
$col = $db->command(参数);同上,也是可以创建一个集合,该指令可以执行很多Mongo命令,,,,,,
$db->getCollectionNames();获取db中所有集合的名称
$db->dropCollection('test');删除集合test
$col = $db->test;选中test集合
$col = $db->selectCollection('test');同上,也是选择某个集合
其他例如getDBRef()等函数,可参看文档
4.选择集合:
$col = $db->myct;选中集合myct
$col = $db->selectCollection(‘myct’);同上也是选中myct集合
5.集合操作之增:
$col->insert(array,options);
其中array表示需要插入的数据,一般都是一个数据。
options表示插入数据的参数,支持5个参数:
fsync 默认为false,如果为true,那么在插入数据成功前,会强制将数据写入硬盘。如果该参数为true,那么w参数无论是什么值,都将被置为0
j 默认为false,如果为true,那么在插入数据成功前,会强制将数据写入日志。如果mogodb突然宕机,那么这些写入到日志的数据变更是可以恢复的
w默认值为1,用于确认或者不确认写操作。设置为1,写操作将会被(主)服务器确认。如果设置为n,则主服务器修改数据操作成功的复制到n个节点后确认写操作。
wtimeout服务器等待接收确认的时间,单位为毫秒
timeout客户端等待服务器响应的超时时间,默认为毫秒。
6集合之查询:
$col->findOne(where,field)查找一个文档
其中where标示查询的条件,field标示需要返回文档中的哪些字段
$res = $col->findOne(array('x'=>1,'y.b.b'=>array(1,3)),array('y.a','x'));标示查询出x值为1,并且y.b.b值为数组1,3的集合,返回y.a和x字段的值
$col->find(where,field)
$m = $col->find(array('x'=>1));返回x值为1的文档,如果有多个文档,那么$m就是一个mongoCursor对象,可以通过foreach循环来获取每一个文档的信息
7.对查询结果进行过滤:
$res = $col->find(array('x'=>1)).skip(1)->limit(1);对查询出的文档忽略第一条数据,然后只获取一条数据,也就是获取第二条数据。
8,对查询出的结果进行数量统计:
$count = $col->find(array('x'=>1))->count();统计出x值为1的文档数量
如果count要和skip,limit配合使用,那么需要给参数true,否则将忽略skip,limit函数的作用
9.条件操作符$lt,$gt,$lte,$gte使用:
$res = $col->find(array('x'=>array('$lt'=>3)));查询出x小于3的文档
$res = $col->find(array('x'=>array('lt'=>6,'$gt'=>1)))查询出x大于1小于6的文档;
10.$ne使用:
$res = $col->find(array('x'=>array('$ne'=>3)));查询出x不等于3的文档
11 $in和$nin使用:
$res = $col->find(array('y.a'=>array('$in'=>array(1,3))));查询出y.a值为1或者3的文档
$res = $col->find(array('y.a'=>array('$nin'=>array(1.3))));查询出y.a值不为1或者3的文档,其中也会查询y.a不存在的文档
12.$all完全匹配:
$res = $col->find(array('y.a'=>array('$all'=>array(1,3))));查询出y.a值为数组,数组值包含1,3的文档
$res = $col->find(array('y.a'=>array('$eq'=>array(1,3))));查询出y.a值为数组,数组值等于1,3的文档
13.$or:
$res = $col->find(array('$or'=>array(array('x'=>array('$ne'=>1)),array('y.a'=>array('$gt'=>3)))));查询出x不等于1或者y.a大于3的文档
14.$slice使用,用来限制返回值数值的个数:
$slice可对字段的值进行裁剪,如果该字段为一个数组,数组中有多个值,那么可使用$slice来指定输出数组的值的个数。
$res = $col->find(array('x'=>1,'y.a'=>1),array('y.b'=>array('$slice'=>2)));查询出x等于1,y.a包含1的文档,输出y.b的数据时只去前2个数值
array('$slice'=>-2);表示取最后两个数值。
array('$slice'=>array(1,3));表示忽略第一个文档,结果取3条文档
15.$exists
$res = $col->find(array('c'=>array('$exists'=>true)));查询出c字段存在的文档
$res = $col->find(array('c'=>array(''$exists'=>false)));查询出c字段不存在的文档
16.使用正则查找,需要使用MongoRegex类,,,,,,略,,,,,查看手册.....
17.php更新数据:
$col->update(where,updateData,options);
其中where表示更新哪些文档,updateData表示需要更新的数据,options表示更新的参数,其中参数包括其中几个:
upsert:如果设置为true,那么如果没有查询到文档,那么就新增一条文档
multiple:如果设置为true,那么如果查询出多条文档,那么全部都更新
j:默认假,如果设置为true,那么在更新结果返回前,会写日志。
fsync:如果设置为true,那么在更新结果返回前,需同步数据到磁盘。如果设置了该值为true,那么无论w为何值,都强制变为0
w:如果设置为n,那么主服务器将更新复制到第n个从节点后确认该操作,默认是0
wtimeout:服务器等待接收确认的超时时间,单位为毫秒
timeout:客户端等待服务器返回数据的时间,单位为毫秒
18.$inc使用,增加值
$res = $col->update(array('x'=>1),array('$inc'=>array('x'=>2)));查询出x等于1的文档,并将x的值加2,只会更新查询出来的第一条文档
19 $set修改值
$res = $col->update(array('x'=>4,array('$set'=>array('y.a'=>array(1,2,3)))));查询出x等于4的文档,将其y.a的值改为数组1,2,3
20 $unset删除字段
$res = $col->update(array('x'=>4,'y.a'=>array(1,2,3)),array('$unset'=>array('y.b'=>1)));删除y.b
21.$rename更新字段名字
$res = $col->update(array('x'=>4),array('$rename'=>array('x'=>'xx','y'=>'yy')));把x值为4的文档,x变更为xx,y变更为yy
22.$push向字段中添加值
$res = $col->update(array('x'=>4),array('$push'=>array('y'=>'44')));向x等于4的文档中对y插入44.如果y不存在就创建;如果y的值不是数组就给出异常
23.如何一次插入多个值呢?
例如:插入前:
如果我想往y.b.a中插入4,5,那么该如何插入呢?
$res = $col->update(array('x'=>4),array('$push'=>array('y.b.a'=>array(4,5))));结果像这样插入:
与我们的目标不一样,
可这样:
$res = $col->update(array('x'=>4),array('$push'=>array('y.b.a'=>array('$each'=>array(5,6)))));
结果如下:
24.$addToSet不存在添加,即添加的数据不存在的时候就添加,如果存在就不添加。
$res = $col->update(array('x'=>4),array('$addToSet'=>array('y.b.a'=>array('$each'=>array(6,7)))));
结果:
由于目标数组中有6,所以只有7添加进去了
$res = $col->update(array('x'=>4),array('$addToSet'=>array('y.b.a'=>4)));
添加一条记录:
25.$pop删除数组中的元素,-1标示删除第一个,1标示删除最后一个:
$res = $col->update(array('x'=>4),array('$pop'=>array('y.b.a'=>1)));
$res = $col->update(array('x'=>4),array('$pop'=>array('y.b.a'=>-1)));
最前面的1被删除了
$res = $col->update(array('x'=>4),array('$pop'=>array('y.b.a'=>array('$each'=>array(2,3)))));本打算批量删除的,结果这样写把最后的一个7给删除了,真奇怪,,,咋批量删除啊啊啊!!!!!!!!!!!!!!!!!!!!!
26.$pull删除操作,,,差啊,
$res = $col->update(array('x'=>4),array('$pull'=>array('y.b.a'=>2)));
删除2
批量删除,删除3和6:
$res = $col->update(array('x'=>4),array('$pullAll'=>array('y.b.a'=>array(3,6))));
27.删除数据
remove(where ,options);删除数据
where表示删除的条件,options表示删除选项,其中包括如下参数:
justOne:如果设置为true,那么只会删除一个文档,默认为false.
fsync:如果设置为true,那么在数据更新结果返回前会同步数据到磁盘。如果设置为true,那么无聊w设置为什么,都会强制设置为0
w:如果设置为false,那么更新操作将不会确认。如果设置为n,那么在数据更新到第n个节点后确认操作。
j:如果设置为true,那么会在更新结果返回前,写日志,默认为false
wtimeout:等待确认时间,单位为毫秒,默认为10000
timeout:客户端等待服务端数据返回超时时间,默认为10000毫秒
28 删除整个库drop
$m = $c->mm->drop();删除mm库
后续更新.....