老波折了,先看的菜鸟-》mogodb官网手册没看太懂-》装扩展,看php离线手册,发现都是一堆驱动类-》百度发现别人new的类和我不一样啊(其实百度人家用的就是php和mongo手册上的这个库,我没看见),我new的和tp5的mongodb类库一样-》看phpweb手册,也没细看直奔类库而去,根据类的demo自己封装类库封了一天-》才发现下图
尼玛竟然有教程和现成的类库
安装这类库时要注意:他会检查你扩展版本号。你composer的时候,如果不指定具体版本号。他会报错
mongodb的一些通用命令
1、操作库
> show dbs //显示所有数据库
> db //显示当前数据库
> use 数据库名字 //有,选择数据库;无,新建数据库(添加完数据才会显示该库,否则只能用db看)
> db.dropDatabase() //删除库(先进入要删除的库,在执行)
2、操作表
> show collections //显示该库下的所有表(上面已经选择库了)
> db.createCollection("表名") //创建数据表
> db.createCollection("mycoll", {capped:true, size:100000}) //创建固定大小的表
总结创建表有2种方式:
1、按照正常套路,一步一步来
2、使用db.表名.insert()插入数据,后就自动生成了
> db.表名.drop() //删除表(先进入库中,在执行)
curd操作
注意:此篇博文操作以此admin表为结构,curd同一种会写3遍
第1遍:mysql的sql语句,结尾加分号
第2遍:mongodb的shell命令
第3遍:php安装mongodb扩展,使用mongdb类库
公共部分:连接数据库 + 操作哪个库 + 操作哪个表
//用官方composer下来的。http://php.net/manual/zh/mongodb.tutorial.library.php require '../vendor/autoload.php'; //composer的自动加载 echo "<pre />"; $client = new MongoDB\Client("mongodb://localhost:27017"); //直接连接数据库。没有输入账号密码 $collection = $client->boke->admin; //boke是库名-》admin是表名。和命令行use一样,有则进入数据库,无则创建
增
1、insert into admin (name,pass,age,addr) values ('西瓜','123',26,'广州'); //mysql添加一条数据
2、命令行语法:db.表名.方法名({字段:'值',字段:'值'}) //注意:自己输入_id字段,不然id会是个对象。和sql一样,该_id要唯一
2.1、db.admin.insertOne({_id:3,name:'西瓜',pass:'123',age:26,addr:'广州'}) //插入一条
2.2、db.admin.insertMany([{_id:4,name:'西瓜1',pass:'123',age:26,addr:'广州'},{_id:5,name:'西瓜2',age:26,addr:'天河'}])
//插入多条。注意:用[]将多条数据括起来
3、代码调类库法:数据库实例->方法(以数组形式传参);
3.1、插入单条
$data = ['_id'=>'111','name'=>'瓜瓜','pass'=>'456','age'=>26,'addr'=>'广州市']; $oneInsert = $collection->insertOne($data); echo "获取刚插入的id'{$oneInsert->getInsertedId()}'";
3.2、插入多条。注意:这比插入单条那获取id的方法多个s
$insertManyResult = $collection->insertMany([ ['_id'=>'112','name'=>'瓜瓜1','pass'=>'456','age'=>26,'addr'=>'广州市'], ['_id'=>'113','name'=>'瓜瓜2','pass'=>'456','age'=>26,'addr'=>'广州市'] ]); //传个二维数组 echo '刚才插入的总条数是:'.$insertManyResult->getInsertedCount(); var_dump($insertManyResult->getInsertedIds()); //获取刚插入的id。比插入单条多个s
删
1、delete form admin where id=1; //mysql删除id=1的
2、命令行语法:db.表名.方法名({字段:'值'})
2.1、db.admin.deleteOne({id:1}) //删除一条
2.2、db.admin.deleteMany({name:'西瓜'}) //删除多条。
3、代码调类库法:数据库实例->方法(以数组形式传参);
3.1、删除单条
$oneDelete = $collection->deleteOne(['_id' => 4]); //删除id=4的 echo '删除了'.$oneDelete->getDeletedCount().'条'; //获取删除的总条数
3.2、删除多条 //删除年龄<=26的
$manyDelete = $collection->deleteMany(['age' => ['$lte' => 26 ] ]); //注意:和数字沾边的。整数和字符串是有区别的,千万不要写错 echo '总共删除了'.$manyDelete->getDeletedCount().'条';
改
1、update admin set addr='广东省广州市' where id=2; //mysql将id=2的,地址修改为广东省广州市
2、命令行语法:db.表名.方法名({字段:'值'},{操作符:{字段:值}}) //第1个参数是条件表达式(where条件);第2个参数是要钩盖的数据(set 字段=新值)
2.1、db.admin.updateOne({_id:"112"},{$set:{name:'杨西瓜'}}) //修改一条
2.2、db.admin.updateMany({pass:'456'},{$set:{pass:'123'}}) //修改多条。
3、代码调类库法:数据库实例->方法(以数组形式传参);
3.1、修改单条
$oneUpdate = $collection->updateOne( ['_id' => '112'], //更新条件,_id=112 ['$set' => ['age' => 26]] //age字段的值改为26; 注意:'字段'引号中不要加空格等,否则系统会认为这个字段没有,而变成新增这个字段 ); echo '更新成功'.$manyUpdate->getModifiedCount().'条'; //返回更新成功的条数,重复更新数据 返回0
3.2、修改多条
$manyUpdate = $collection->updateMany( //年龄小于20岁的,都改为16岁 ['age' => ['$lte' => 20]], ['$set' => ['age' => 16]] ); echo '更新成功'.$manyUpdate->getModifiedCount().'条'; //返回更新成功的条数,重复更新数据 返回0
查
demo1: 查全部
1、select * from admin; //mysql查admin表的
2、db.admin.find().pretty() //命令行查全部。pretty()相当于mysql的\G,就是格式化
3、$result = $collection->find(); //啥条件都别带
demo2: 表达式查询
1、select * from admin where age >= 18;
2、db.admin.find({age:{$gte:18}}) //{$gte:20}是个表达式。查 age>=18
3、年龄>=18岁的
$where = ['age' => ['$gte' => 18]]; $result = $collection->find($where);
demo3:区间查询
1、select * from admin where age >=18 AND age <= 21;
2、db.admin.find({age:{$gte:18,$lte:21}})
3、年龄在18-21之间的
$where = ['age' =>['$gte' =>18,'$lte'=>21]]; //区间查询,每个条件是一个元素 $result = $collection->find($where);
demo4: 多条件(并且 AND)
1、select * from admin where addr='广州市' AND age=26;
2、db.admin.find({age:{$gte:26},addr:'广州市'})
3、地址是广州 并且 年龄>=26
$where = ['addr' => '广州市','age' => ['$gte' => 26]]; //多条件 并且关系,直接用逗号隔 $result = $collection->find($where
demo5:多条件(或 OR)
1、select * from admin where name='西瓜' OR age=26;
2、db.admin.find({$or:[{name:'杨西瓜',age:26}]}) 这个表达式逻辑有点问题
3、地址是广州 或者 年龄>=26
demo6: 多条件(先AND后OR)
1、select * from admin where age>=30 AND name='瓜' OR addr='广州';
2、 db.admin.find({age:{$gte:20},$or:[{name:'杨西瓜',addr:'广州'}]}) 这个表达式逻辑有点问题
3、年龄>=30 并且 姓名是杨西瓜 或 地址是广州
demo7: 排序
1、select * from admin ORDER BY age desc; //岁数大的倒序
2、db.admin.find().sort({age:-1})
3、-1降序;1是升序
demo8: limit限制条数
1、select * from admin limit 1;
2、db.admin.find().limit(1).pretty() //注意:这没有从第几条开始,取几条
3、查1条
3.1、使用findOne方法 //专业查单条
$oneSelect = $collection->findOne(['name' => '赵柳']);
3.2、使用find+limit限制下
$where = []; $opt = [ 'limit'=>1 ]; $result = $collection->find($where,$opt);
demo9: 分组
1、
2、
3、地址是广州 并且 年龄>=26
demo10: 模糊查询
1、select * from admin where name like '%瓜';
2、db.admin.find({name:/瓜$/}) //瓜结尾
db.admin.find({name:/^西/}) //西开头
3、模糊查询,以瓜结尾的
$where = ['name' => ['$regex'=>'瓜$']]; $result = $collection->find($where);
索引
第1个参数:给哪个字段加索引
第2个参数开始都是可选的,详细参见表格
可选参数参考:http://www.runoob.com/mongodb/mongodb-indexing.html
db.表名.ensureIndex({"name":1}) //给name字段创建为索引
备份与恢复
导出:
mongodump -h 127.0.0.1:27017 -d test -o / //将test数据库,备份到根目录下(根目录下会生成个和数据库同名的目录)
-h:先连接要导出的数据库
-d:要导出的数据库;不加是备份所有;
-o:导出到哪里
导入:
mongorestore -h 127.0.0.1:27017 -d test3 /test //test3数据库,可以不存在,无则自动创建)
-h:先连接要导入的数据库
-d:从xx(/test)位置-》将备份导入到xx(test3)数据库
监控
mongostat //发现数据库突然变慢或者有其他问题的话,首先查看mongo的状态
mongotop -6 //每隔6秒,输出所有表的性能(读、写花的时间)
详细看:http://www.runoob.com/mongodb/mongodb-mongostat-mongotop.html
$type操作符
是基于BSON(二进制的json)类型来检索集合中匹配的数据类型,并返回结果
//查 "col" 集合(表)中 title (字段数据类型为)为 String 的数据
db.col.find({"title" : {$type : 2}})