一、简介
1、是什么:MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,语法有点类似javascript面向对象的查询语言,它是一个面向集合的,模式自由的文档型数据库。
2、特点:它的特点是高性能、易部署、易使用,存储数据非常方便。适用于大存储、高并发的网站
3、概述
(1)主要目标:高的性能,扩展强(分布式存储)
(2)面向文档的数据库
(4)以bson格式存储数据
(5)javascript作为操作语言
(6)支持多种语言:php python java c++等
(7)支持GridFs(大文件存储)
4、mongodb与mysql性能比较
不支持连表查询,不支持sql语句,不支持事务存储过程等,所以不适合存储数据间关系比较复杂的数据,一般主要是当做一个数据仓库来使用。
适用于:日志系统,股票数据,等。
1、文档
是mongoDB中数据的基本单元,类似关系数据库的行,
多个键值对有序地放置在一起便是文档。
{键1:值1,键2:值2,键3:值3……………}
{ “username”:”Tom”, “age”:10 }
{ "username":"Tom" , "age" : "10" }
{“Username”:”Tom”,”age”:10}
注意:
①.以上是3个不同的文档,MongoDB区分大小写的数据类型,第一个age字段是数字类型,第二个age是字符串类型。
②. 每一个文档尺寸不能超过16M
2、集合
多个文档形成一个集合,集合就类似于关系型数据库里面的表。
无模式是指,在同一个集合中可以包含不同格式的文档,如:
{ "Name" : "Mongodb" , "Type" : "Nosql" }
{ "UserName" : "Tom" , "age" : 20 , "Gender" : "male" }
以上两个文档可以放在同一个集合中。
在Mysql需要先建表再插入数据,
模式自由(schema-free):意思是集合里面没有行和列的概念,
MongoDB中的集合不用创建、没有结构,所以可以放不同格式的文档。
3、数据库
多个集合可以组成数据库。一个mongoDB实例可以承载多个数据库,他们之间完全独立。
Mongodb中的数据库和Mysql中的数据为概念类似,只是无需创建。
一个数据库中可以有多个集合。
一个集合中可以有多个文档。
三、安装软件和卸载
1、把解压的的文件(mongodb)拷贝到指定的目录,最好是wamp目录下,以方便管理
2、新建一个data目录用于存储数据库文件,新建一个log.txt文档用于存储日志信息
3、以管理员的身份进入dos窗口,进入mongodb的bin目录下说明:也可以使用会话级别无需安装直接启动mongod(在语法上少了--install)
f:\server\mongodb\bin>mongod --logpath f:/server/mongodb/log.txt --dbpath f:/server/mongodb/data
5、安装完之后启动服务:net start mongodb,也可以通过服务界面开启
6、使用mongo.exe客户端连接mongodb服务器mongo localhost 27017
7、卸载:在bin目录下执行:mongod --remove
四、入门语句
1、创建数据库
语法:use 数据库名称
如:> Use user
2、创建集合(相当于sql表)
语法:db.集合名.insert({键1:值1,……})
3、查看数据库:show dbs
4、查看集合:show tables
5、删除集合
语法:db.集合名.drop()
如:> db.php.drop()
6、删除数据库:语法: db.dropDatabase()
7、查看帮助:help、db.help()、db.php.help()
8、for
> for(var i=1;i<9;i++){
... db.java.insert({name:"java"+i,dire:"web"+i})
... }
9、常用操作符:
$lt , $lte , $gt , $gte ( < , <= , > , >= ), $ne ( <> ) ,$in , $nin , $or , $not, $mod (取模), $exists, $where
操作符用法:
如: 查询年龄小于20岁的用户
db.user.find( {"age" : { "$lt" : 20 } } )
db.php.remove({age:{‘$gt’:7}})
五、基本操作
1、添加文档
语法:db.集合名.insert({键1:值1,键2:值2………..})
> db.php.insert({name:"xiaoliang",age:22,address:"guangzhou"})
> db.php.insert({name:"xiaoli",age:16,address:"muye"},{name:"woailuo",age:16,address:"sharen"})
2、删除文档
语法:db.集合名.remove({条件}) 注意:如果不加条件,则删除所有的文档。
案例1:比如要删除年龄等于5的文档
db.php.remove({age:5})
案例2:要删除年龄大于7的文档
db.php.remove({age:>7})
3、修改文档
语法:db.集合名.update({条件},{新的文档})
案例1:比如把年龄等于22的文档的name改为 “xiaoshui”
>db.php.update({age:22},{name:'xialshui'})
案例2:使用修改器完成,把年龄等于3的文档的name改为 “xiaosan”,并且不能丢失其他的键值。
>db.php.update({age:16},{'$set':{name:'Shikamaru'}})
4、查看文档
(1)基本语法
db.集合名.find({条件})
案例1:查寻i等于5的文档
db.php.find({i:5})
案例2:查询i大于5的文档
>db.php.find({i:{'$gt':5}})
(2)count 数量
案例3:查询集合里面文档的数量
db.php.count(),也可加find()查询满足条件的数量
> db.php.count()
> db.php.find({i:{'$gt':5}}).count()
(3)sort 排序
案例4:根据年龄降序查询文档
db.集合名.find().sort({age:1})根据年龄升序
db.集合名.find().sort({age:-1})根据年龄降序
> db.php.find().sort({i:1}) 根据i值升序
> db.php.find().sort({i:-1}) 根据i值降序
(4)limit
案例5:取出前5个文档
语法:db.集合名.find().limit(5)
> db.php.find().limit(3);
(5)skip 偏移量
案例6:取出第2个到第5个文档。 类似于mysql limit 偏移量 取出的数量
语法:db.集合名.find().skip(偏移量).limit(取出的数量)
>db.php.find().skip(3).limit(3); 从第三条记录开始,查询出3条
六、权限验证
Mongodb权限范围说明
① 普通用户:mongodb里面的用户是属于某个数据库的,某个数据库的用户登录后只能操作所属的数据库。
② 超级用户:可以操作其他数据库和删除其他用户
1、添加用户
(1)步骤:
(1)选择数据库:use 数据库
(2)开始增加用户:db.addUser(用户名,密码,是否只读)
如果为ture是只读,则该用户只能查询,无法修改。默认是 false,可以读写的。
(2)前提
在给数据库设置用户密码时,要必须先设置一个超级管理员。
添加超级管理员:
> use admin
> db.addUser(‘root’,’123456’)
给user数据库添加一个管理员
> use user
> db.addUser(‘user’,’123456’)
2、权限验证生效
(1)注意:
要使用权限验证(卸载服务重新安装),如果是安装成window的一个服务则要重新安装,在重新安装时,添加一个选项--auth (--auth 表示要使用权限验证)
如果是直接启动的方式来启动mongodb的,则重新启动,在启动时,添加 --auth选项。
f:\server\mongodb\bin>mongod --logpath f:/server/mongodb/log.txt --dbpath f:/server/mongodb/data --auth
(2)验证语法:
(1)use 数据库
(2)db.auth(用户名,密码)
> use user
> db.auth('user',123456)
3、查看用户
在那个数据库就能看到该用户的用户信息
> db.system.users.find()
4、删除用户
如果想要删除用户,则把system.users集合里面的用户对应的文档删除即可。
Db.system.users.remove({user:’xiaoliang’})
总结:
(1)非admin数据库的用户不能使用数据库命令,比如show dbs等。
(2)admin数据库中的用户被视为超级用户(即管理员)。在认证之后,管理员可以读写所有数据库,执行特定的管理命令,
(3)在开启安全检查之前,一定要至少有个管理员账号。
(4)数据库的用户账号以文档的形式存储在system.users集合里面。可以在system.users集合中删掉用户账号文档,就可以删除用户。
七、php操作mysql
安装合适的扩展
下载合适的php_mongodb.dll文件。
(1)php的版本
(2)是否是线程安全的thread safe(ts)
(3)是vc几的
(4)php是32位的还是64位的。‘
2、把合适的扩展拷贝到php的安装目录的ext目录里面。
3、打开php.ini文件,引入该扩展:extension=php_mongo.dll
4、重启apache之后通过phpinfo()查看是否有mongo信息入门使用:
(1)连接mongodb:
//$m = new Mongo("mongodb://用户名:密码@主机地址:端口/选择数据库");
$m = new Mongo("mongodb://user:123456@localhost:27017/user");
(2)选择要操作的数据库
$db = $m -> selectDb("user");
(3)増删改查
在php中:
(3)増删改查
在php中:
. 换成 ->
{}换成array()
① 添加文档(行)
//原:db.test.insert({name:'xiaoliang '})
//$db -> test -> insert(array('name'=>'xiaoliang','age'=>22));
② 查询
//原:db.test.find()
$data = $db -> test -> find();
foreach ($data as $d){
//echo "<pre>";
//var_dump($d);
echo $d['name'].'--'.$d['age'].'<br/>';
}
//查询age=25的文档:返回的是结果集,就算是一条数据也是一个二维数组
$data = $db -> test -> find(array('age'=>25));
//查询大于25的文档
$data = $db -> test -> find(array('age'=>array('$gt'=>25)));
foreach ($data as $d){
echo $d['name'].'--'.$d['age'].'<br/>';
}
③ 修改
//原:db.test.update({name:'user8'},{'$set':{age:288}})
$db -> test -> update(array('name'=>'user8'),array('$set'=>array('age'=>28)));
① 添加文档(行)
//原:db.test.insert({name:'xiaoliang '})
//$db -> test -> insert(array('name'=>'xiaoliang','age'=>22));
② 查询
//原:db.test.find()
$data = $db -> test -> find();
foreach ($data as $d){
//echo "<pre>";
//var_dump($d);
echo $d['name'].'--'.$d['age'].'<br/>';
}
//查询age=25的文档:返回的是结果集,就算是一条数据也是一个二维数组
$data = $db -> test -> find(array('age'=>25));
//查询大于25的文档
$data = $db -> test -> find(array('age'=>array('$gt'=>25)));
foreach ($data as $d){
echo $d['name'].'--'.$d['age'].'<br/>';
}
③ 修改
//原:db.test.update({name:'user8'},{'$set':{age:288}})
$db -> test -> update(array('name'=>'user8'),array('$set'=>array('age'=>28)));
把mysql的数据存储到mongodb中
header("content-type:text/html;charset=utf-8");
//连接mongodb数据库
$m = new Mongo("mongodb://user:123456@localhost:27017/user");
$db = $m -> selectDb("user");
/* 取出mysql数据 */
mysql_connect("localhost","root","root");
mysql_query("set names utf8");
mysql_query("use ecshop");
$res = mysql_query("select * from ec_category");
while($row=mysql_fetch_assoc($res)){
//把遍历出来的数据直接添加到mongodb中
$db -> category -> insert($row);
}
/* 查看存储到mongodb中的数据 */
$data = $db -> category -> find();
foreach($data as $d){
echo $d['id'].'--'.$d['ca_name']."<br/>";
}