mongo学习三、mongodb扩展 和 命令的使用

点击查看所有命令

老波折了,先看的菜鸟-》mogodb官网手册没看太懂-》装扩展,看php离线手册,发现都是一堆驱动类-》百度发现别人new的类和我不一样啊(其实百度人家用的就是php和mongo手册上的这个库,我没看见),我new的和tp5的mongodb类库一样-》看phpweb手册,也没细看直奔类库而去,根据类的demo自己封装类库封了一天-》才发现下图

尼玛竟然有教程和现成的类库

安装这类库时要注意:他会检查你扩展版本号。你composer的时候,如果不指定具体版本号。他会报错


mongodb的一些通用命令

1、操作库

> show dbs              //显示所有数据库

> db    //显示当前数据库

> use 数据库名字         //,选择数据库;无,新建数据库(添加完数据才会显示该库,否则只能用db看)

> db.dropDatabase()    //删除库(先进入要删除的库,在执行)

扫描二维码关注公众号,回复: 2654938 查看本文章

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=4echo '删除了'.$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)位置-》将备份导入到xxtest3)数据库


监控

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}})


猜你喜欢

转载自blog.csdn.net/qq_33862644/article/details/80590851