NoSQL(MongoDB)
一、了解MongoDB
1、什么是MongoDB?
概念
MongoDB是NoSQL类型的文档型数据库。
2)什么是NoSQL?
NoSQL是非关系型数据存储的广义定义,通常以key-value形式存储数据,没
有表结构(注:memcache和redis也市nosql产品)。
NoSQL优点
易扩展
快速的读写
低廉的成本
架构的灵活性,没有复杂的关系
4)NoSQL缺点
没有标准化
没有正式的官方支持
、MongoDB存储方式
mongodb是文档型数据库,文件以BJSON格式存储在硬盘中。
BSON是JSON的一种二进制形式的存储格式.
mongodb内部执行引擎为JS解释器, 把文档存储成bson结构,在查询时,转换为JS对象,并可以通过熟悉的JS语法来操作.
简单总结:
mongodb是文档型数据库
mongodb、redis、memcache都属于nosql产品
什么是nosql:非关系型数据库的广泛定义、一般数据以键值对形式存储,没有表结构
redis和memcache存在内存中
mongodb存储在磁盘文件中
二、MongoDB的安装与配置
1、下载
http://www.mongodb.org/downloads
在32位系统上,数据库文件总共不能超过2G,否无法再插入数据。推荐使用64位操作系统。
安装成功后需要自己创建服务
2、安装
3、创建MongoDB 服务
- 前 提:在mongodb安装目录下创建data目录用于存放后期数据
- 创建服务:mongod –install –dbpath 数据目录 –logpath 日志文件
- 删除服务:mongod –remove
- 启动服务:net start MongoDB
- 关闭服务:net stop MongoDB
4、连接MongoDB服务器
语法:mongo 服务ip地址:端口/数据库名
简写:mongo
默认端口27017
或者
三、Mongodb基本概念
- MySQL数据库中有:数据库(Database)、表(table)、记录(Record)
- mongodb数据库中有:数据库(database)、集合(collection)、文档(document)
MongoDB集合对应关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。
四、入门命令
1、库和集合操作
# 查看已有数据库
语法:show databases; 或者 show dbs;
举例:
# 选择数据库
语法:use 数据库
举例:
# 查看已有的集合/表
语法:show collections 或者 show table
举例:
# 创建集合(表)
语法:db.createCollection(集合名)
举例:
︴是否可以验证数据库是否自动创建
# 删除集合表
语法:db.集合名.drop()
举例:
删除库:db.dropDatabase();
2、增删修查(CURD)
# C 增
- 语法:db.集合名.insert(json数据)
- 说明:集合存在-则直接插入数据,集合不存在-则插入数据时自动创建
- 举例:插入到test集合中,姓名叫zs年龄18岁
db.test.insert({name:’zs’,age:18});
插入成功自动创建一个唯一的ID
︴思考1:是否可以自定义_id值?
答:可以,插入的时候增加_id键即可替换
︴思考2:如何插入多条记录?
答:可以
语法:db.集合名.insert([
{},
{},
{}
]);
︴扩展练习:结合js循环插入多条记录?
循环:for
打印:print(变量名);
案例:循环显示1-10
需求:在test集合中循环插入8条数据:格式 name:heng自增 age:自增
for (var i =1; i<=8; i++) {
db.test.insert({name:”heng”+i, age:i});
}
# D 删
- 语法:db.集合名.remove(条件,是否删除一条)
- 说明:
- 条件,就是写json格式数据
- 是否删除一条:true-是,false-否(默认)
# U 改
# 创建测试数据
use test1;
db.createCollection(“c1”);
for(var i = 1; i<= 10; i++){
db.c1.insert( {“name”:”zs”+i,”age”:i} );
}
- 语法:db.集合名.update(条件,新数据,是否新增,是否只修改多条)
- 说明:
- 参数3:是否新增(true-找不到则插入,false-找不到就不管,默认)
- 参数4:是否修改多条(true-全部修改,false-只修改一条,默认)
︴练习1:将{name:“zs1“}改为{name:“zs2“}
db.c1.update({name:”zs1″}, {name:”zs2″});
︴思考1:如何解决练习1的(替换)问题?
发现:上述代码不是修改,而是替换新数据
解决:通过(修改器)
语法:db.集合名.update(条件,{修改器:{键:值}})
需求:将age=2的数据name改成zs22
————————————-
原本操作:db.c1.update({age:2}, {name:”zs22″});
瑕疵:替换数据
解决:使用修改器($set)
套用语法:db.c1.update({age:2},{$set:{name:”zs22″}})
︴练习2:给{name:“zs10“}的年龄加2岁
db.c1.update({name:”zs10″},{$inc: {age:2}});
多学一招:思考如何减年龄
回答:负数
db.c1.update({name:”zs10″},{$inc: {age:-2}});
︴练习3(修改器综合练习):
- 数据:
db.test3.insert( {name:”猪八戒”,age:888,who:”男”,other:”非国人”});
- 需求:
name 改成 孙悟空 ( 修改器:$set)
age 增加 111 ( 修改器:$inc)
who 改字段 sex ( 修改器:$rename)
other 删除 (修改器:$unset)
db.test3.update(条件, );
{修改器:{键:值}}
{$set:{name:”猴子”}}
{$inc:{age:111}}
{$rename:{who:”sex”}}
{$unset:{other:”非国人”}}
组合一起使用修改器
db.test3.update({name:”猪八戒”}, {
$set:{name:”猴子”},
$inc:{age:111},
$rename:{who:”sex”},
$unset:{other:”非国人”}
});
︴练习4:验证语法最后两个参数:是否新增[默认false], 是否修改多条[默认false]
- 验证是否新增:修改name 等于 zs30的年龄 30岁
- 验证是否修改多条:修改name 等于 zs2的年龄 22岁
# R 查
- 语法:db.集合名.find(条件[,查询的列])
- 查询条件说明:
- {name:”zs”} 查询name等于zs的数据
- {age:18} 查询age等于18的数据
- {name:”zs”, age:18} 查询name等于zs并且age等于18的数据
- 查询的列说明
- {name:1} 查询的数据只显示name字段
- {name:0} 查询的数据显示所有字段,除name意外
- {name:1, age:0} 只查询name字段
︴练习:查询所有数据
︴思考1:查询年龄大于5岁的数据?
语法:db.test.find({键:{修改器:值}});
案例:db.test.find({age:{$gt:5}});
︴思考2:查询年龄是5岁、8岁、10岁的数据?
案例:db.test.find({age:{$in:[5,8,10]}});
总结
什么是Mongodb:nosql类型的文档型数据库
什么是nosql:非关系型数据库的广泛定义,一般以键值对象形式存储,不需要设计表结构的数据库可以称之为
—————————–
【安装】
安装服务:mongod –install –dbpath=数据目录 –logpath=日志文件
卸载服务:mongod –remove
启动服务:net start MongoDB
停止服务:net stop MongoDB
—————————–
【入门命令】
查看数据库: show databases; 或 show dbs;
查看集合/表:show tables; 或 show collections;
选择数据库: use 数据库名(注:不存在不会报错,后期插入数据会自动创建)
创建集合: db.createCollection(集合名)
删除集合: db.集合名.drop();
删除数据库: db.dropDatabase();
—————————————————
【增】
语法:db.集合名.insert(json数据)
说明:集合存在-则直接插入数据,不存在-则创建
—————————————————
【删】
语法:db.集合名.remove(条件,是否删除一条)
说明:是否删除一条(true-是,false-否,默认)
—————————————————
【改】
语法:db.集合名.update(条件,新数据,是否新增,是否删除多条)
说明:
参数3:是否新增(true-未匹配数据则新增,false匹配到数据则修改,默认)
参数4:是否删除多条(true-删除多条,false-只删一条,默认)
单修改器语法:db.集合名.update(条件,{修改器:{键:值}})
多修改器语法:db.集合名.update(条件,{
修改器:{键:值},
修改器:{键:值},
修改器:{键:值}
})
—————————————————-
【查】
语法1:db.集合名.find(条件,查询的列)
语法2:db.集合名.findOne();
格式化打印:find().pretty()
五、MongoDB的权限机制
1、权限机制概述
在mongodb里面的用户是属于数据库的,每个数据库有自己的管理员,管理员登录后,只能操作所属的数据库。
3.x.x版本默认看不到admin数据库,但是可以选择并查看对应的表;
2.x.x版本 通过show dbs 可以直接查看admin数据库
开启验证模式
1)概念
开启验证模式:就是登陆需要输入账号密码
先登陆创建超级管理员
然后卸载服务
再通过验证模式开启服务(说白了,增加参数让后期输入账号密码才可以登陆)
2)添加超级管理员
- 步骤1:登录
- 步骤2:选择admin数据库
- 步骤3:在admin数据库中添加用户(超级管理员)
db.createUser({
“user” : “admin”,
“pwd”: “admin888”,
“customData” : {employeeId:”提示密码admin888″},
“roles” : [{
role: “root”,
db: “admin”
}]
})
user 代表登录的用户名
pwd 代表登录的密码
customData 备注
role 角色
db 所属数据库
角色信息介绍
角色作用
3)重新以验证模式启动mongod服务
- 步骤1:卸载服务
net stop MongoDB
mongod –remove
- 步骤2:开启验证模式服务(参数–auth)
mongod –install –dbpath=E:\mongodb\data –logpath=E:\mongodb\log1.txt –auth
- 步骤3:启动服务
通过超级管理员账号登陆
- mongo 服务器IP地址:端口/数据库 -u 用户名 -p 密码
- 登录之后输入,db.auth(用户名,密码)
︴课堂案例:
■ 需求
添加用户shop1可以读shop数据库
添加用户shop2可以读写shop数据库
脚下留心:必须在对应数据库创建用户
1)创建测试数据和测试用户(注:选择shop仓库创建用户)
use shop;
for(var i=1; i<=10; i++) {
db.goods.insert({“name”:”goodsName”+i,”price”:i});
}
2)添加用户并设置权限
【shop1】
db.createUser({
“user” : “shop1”,
“pwd”: “admin888”,
“customData” : {employeeId:”提示密码admin888″},
“roles” : [{
role: “read”,
db: “shop”
}]
})
【shop2】
db.createUser({
“user” : “shop2”,
“pwd”: “admin888”,
“customData” : {employeeId:”提示密码admin888″},
“roles” : [{
role: “readWrite”,
db: “shop”
}]
})
验证:shop1可读
3)验证:shop2验证可读可写
六、MongoDB的索引
1、情景设置
向数据库中新增十万条数据
//选择数据库
use test;
//向数据库中添加数据
for(var i=0;i<100000;i++){
db.data1.insert({‘name’:”aaa”+i,”age”:i});
}
2、索引的建立
1)语法
- 创建索引语法:db.集合名.createIndex(待创建索引字段,额外选项)
- 参数:
- 待创建索引字段,语法:{键:1,键:-1}(说明:1表示升序,-1表示降序) ,如:
{age:1}表示给age创建索引并且按照升序的方式存储
- 额外选项,可以设置索引名称,设置唯一索引等
- 删除索引语法:
- db.集合名.dropIndexes() 删除全部索引
- db.集合名.dropIndex(索引名) 删除指定索引
- 查看索引语法:db.集合名.getIndexes()
创建普通索引
需求:给name添加普通索引
语法:
删除索引
给name创建索引并起名chenheng
创建复合/组合索引
需求:给name和age添加组合索引
说明:组合/符合索引就是给两个字段同时加索引(复习:mysql中index(字段1,字段2))
语法:db.集合名.createIndex({键:值,键:值});
创建唯一索引
需求:给name添加普通索引
语法:db.集合名.createIndex(待添加索引的字段,{unique:true})
【设置索引特性】
【测试唯一索引特性】
3、分析索引(explain) executionStats
- 语法:db.集合名.find().explain(‘executionStats’)
- 说明:
COLLSCAN 全表扫描
IXSCAN 索引扫描
FETCH 根据索引去检索指定document
- 练习:
age未添加索引情况
age添加索引情况
七、数据库的备份和还原
1、备份数据库(mongodump)
1)语法
- 导出数据语法:mongodump -h __ -port __ -u __ -p __ -d __ -o __
- 说明
- -h 服务器ip地址(默认:127.0.0.1)
- -port 端口号(默认:27017)
- -u 用户名(开启认证模式则必须)
- -p 密码(开启认证模式则必须)
- -d 备份数据库(注:不写则代表全部)
- -o 备份目录
练习
- 备份所有数据:mongodump -u admin -p admin888 -o E:\mongodb\bak
- 备份指定数据:mongodump -u shop1 -p admin888 -d shop -o E:\mongodb\bak2
2、还原数据库(mongorestore)
1)语法
- 还原数据语法:mongorestore -h __ -port __ -u __ -p __ -d__ –drop 原备份数据目录
- 说明
- -h 服务器ip地址(默认:127.0.0.1)
- -port 端口号(默认:27017)
- -u 用户名(开启认证模式则必须)
- -p 密码(开启认证模式则必须)
- -d database 数据库(不写则还原全部数据库)
- –drop 先删除所有的记录,然后恢复
2)练习
- 还原所有数据:mongorestore -u admin -p admin888 –drop E:\mongodb\bak
切记不要删除admin数据库
- 还原指定数据:mongorestore -u admin -p admin888 -d shop –drop E:\mongodb\bak2
八、PHP 操作MongoDB
1、开启mongodb扩展
1)查看PHP版本信息,选择对应mongodb扩展
2)让PHP支持操作mongo扩展
步骤1:将mongo.dll扩展文件移动到PHP的ext目录中
步骤2:修改php配置文件(php.ini)
步骤3:重启服务
3)运行 phpinfo() 查询是否设置成功。
2、PHP代码
1、php添加数据
<?php
//1.创建对象
$username = ‘admin’;
$password = ‘admin888’;
$host = ‘127.0.0.1’;
$mongodb = new Mongo(“mongodb://{$username}:{$password}@{$host}”);
// var_dump($mongodb);
//MongoDB语法:$对象->数据库名->集合名->增查改删指令();
//多学一招:之前在mongodb窗口输入json数据,先通过php统一改成数据
//增:给php12数据库的test2集合中插入一条数据(name:l4,age:18)
$rs = $mongodb->php12->test2->insert(array(
‘name’ => ‘l4’,
‘age’ => 18
));
var_dump($rs);
//————
echo ‘<hr />’;
发现:开启验证模式后通过PHP操作失败
解决:mongodb3版本存在一个bug,需要将currentVersion改成3,从新添加用户即可
步骤1:关闭并卸载服务
步骤2:创建服务(注:非验证模式)
mongod –install –dbpath=e:\mongodb\data –logpath=e:\mongodb\log1.txt
步骤3:登录将currentVersion的数字改成3即可
步骤4:删除admin用户,创新创建
步骤5:退出、停止服务、并卸载服务
步骤6:重新创建验证模式即可
mongod –install –dbpath=e:\mongodb\data –logpath=e:\mongodb\log3.txt –auth
2、php修改数据
<?php
//1.创建对象
$username = ‘admin’;
$password = ‘admin888’;
$host = ‘127.0.0.1’;
$mongodb = new Mongo(“mongodb://{$username}:{$password}@{$host}”);
// var_dump($mongodb);
//MongoDB语法:db.集合名.update(条件, {修改器:{键:值}});
//PHP中语法:$对象->数据库名->集合名->改(就是将花括号改成数组即可);
//需求:将php12数据库中的test2集合中的数据name改成 z3即可
$rs = $mongodb->php12->test2->update(
array(),
array(‘$set’=>array(‘name’=>’z3’)),
array(‘multiple’ => true)
);
var_dump($rs);
3、PHP遍历数据
<?php
//1.创建对象
$username = ‘admin’;
$password = ‘admin888’;
$host = ‘127.0.0.1’;
$mongodb = new Mongo(“mongodb://{$username}:{$password}@{$host}”);
// $rs = $mongodb->php12->test2->findOne();
// echo ‘<pre>’;
// print_r($rs);
echo ‘<pre>’;
$rs = $mongodb->php12->test2->find();
foreach ($rs as $data) {
print_r($data);
}