NoSQL( MongoDB )
MongoDB
概念
MongoDB是一款NoSQL类型的文档型数据库 就是一个数据库,将数据存储在磁盘文件中
NoSQL
NoSQL 是非关系型数据库的广泛定义
非关系型数据库: 通常以键值对形式存储,没有字段的限制, 如:memcache,redis,mongodb都是
NoSQL优点
快速的读写
NoSQL缺点
没有标准
MongoDB的安装与配置
下载
http://www.mongodb.org/downloads 注: 32位的系统数据不能超过2G
创建MongoDB服务
前提: 现在安装目录下创建data目录,用于后期存放数据
创建服务: bin/mongod.exe --install --dbpath 磁盘路径 --logpath 日志路径
删除服务: bin/mongod.exe --remove
启动服务: net start mongodb
关闭服务: net stop mongodb
连接MongoDB服务器
语法: mongo.exe 服务器ip地址:端口/数据库 (默认test数据库,默认端口27017)
或通过mongo.exe 使用默认进入
Mongodb基本概念
mongodb和mysql的区别
mysql 数据库 有: 数据库 表 记录
mongodb数据库 数据库 集合 文档
mongodb中的集合相当于mysql表,但是集合没有列的限制,体现了模式自由.
mongodb内部执行引擎为JS解释器,把文档存储成bson结构,在查询时,转换为JS对象,并可以通过熟悉的JS语法来操作
库和集合操作
查看已有数据库
语法 : show databases 或 show dbs (* 为官方推荐语法)
选择数据库
use 数据库名; (如数据库不存在不会保存,当改数据库后期有数据时会自动创建 -- 隐式创建)
删除数据库
db.dropDatabase();
注: 删除数据库时,先use选择要删除的数据库后,在执行删除命令
查看已有的集合/表
语法 : show tables 或 show collections (*)
创建集合(表)
语法: db.createCollection(集合名)
注: 当在不存在的数据库中创建集合时,数据库自动创建
删除集合(表)
语法: db.集合名.drop()
增删改查(CURD)
C (Create) 增
语法: db.集合名.insert(json数据)
集合存在则插入,集合不存在自动创建
db.test.insert({name:"nanoha",age:18}); #插入一条name为nanoha age为18的数据
注: 在mongodb中有一个全球唯一的表示 _id
插入数据时可以自定义_id的值
db.test.insert({_id:"数字",name:"nanoha",age:18});
插入多条数据
通过数组方式可以一次插入多条数据
语法:db.集合名.insert([
json数据,
....,
json数据
]);
代码:
db.test.insert([
{name:"zs",age:18},
{name:"zs",age:18},
{name:"zs",age:18}
]);
结合js循环插入多条记录
例如:
for (var i = 1; i <= 10; i++) {
db.test.insert({name:"zs"+i, age: i});
}
D (Delect) 删
语法: db.集合名.remove(条件,[ 是否删除一条数据 默认为false ])
db.test.remove({name:xx}); #删除name=xx的记录
db.test.remove({name:xx},true); #删除索引name=xx的记录
db.test.remove({},true); #从上面删除一条数据
db.test.remove({}); #删除所有数据
U (Update) 改
语法: db.集合名.update(条件,新数据,是否新增,是否修改多条)
是否新增: 指匹配不到数据则插入(true是插入 false是不插入-默认)
是否修改多条: 将匹配到的数据都修改(false否-默认)
db.c1.update({name:"zs1"}, {name:"zs2"}); # 这是替换并不是修改
修改数据
修改器 -
$inc : 增长 可以对文档的某个值为数字型(智能满足要求的数字)的键进行增减操作
$rename : 重命名列
$set : 修改某列的值(如果该字段不存在会增加)
$unset : 删除指定的列
修改数据
db.c1.update({age:2}, {$set:{name:"zs22"}}); #将age=2的字段里的name修改为zs22
db.c1.update({name:"zs10"}, {$inc: {age: 2}}); #给name=zx10的 age加2
db.c1.update({name:"zs10"}, {$inc: {age: -2}}); .... age-2
修改器语法 : db.集合名.update(条件,{修改器:{键:值}})
数据 db.test3.insert( {name:"猪八戒",age:888,who:"男",other:"非国人"});
db.test3.update({name:"猪八戒"}, {
$set: {name:"孙悟空"}, #name 改成 孙悟空
$inc: {age:111}, #age 增加 111
$rename: {who:"sex"}, #who 改字段 sex
$unset: {other:1} # other 删除
});
db.test3.update({name:"zx30"},{age:30},true) # 找不到则插入
db.test3.update({},{name:"hha"},false,true) #不能替换全部数据,可以修改全部数据,切记记得加上修改器
R (Retrieve) 查
语法: db.集合名.find()
db.c1.find() #显示c1中全部数据
db.c1.find({},{age:1}) 只显示age字段
db.c1.find({},{age:0}) 只显示除age字段以外的字段
支持运算符查询
db.c1.find(age:{$gt:5}) 查询age大于5的数据
db.c1.find({age: {$in:[5,8,10]}}); 查询age是5.8.10的数据
MongoDB的权限机制
权限机制概述
说明: 在mongodb中用户属于数据库,也就是每个数据库都有自己的用户
开启验证模式
开启验证模式: 名词 ,指用户需要账号密码才能登陆
a. 在不需要账号密码登陆的情况下,选择admin数据库创建超级管理员
b. 退出mongodb 停止服务 卸载服务
C. 安装需要身份验证的服务(也就是说安装时加上参数--auth)
添加超级管理员
use admin;
db.createUser({
"user" : "admin",
"pwd": "admin888",
"customData" : {employeeId:"提示密码admin888"},
"roles" : [{
role: "root",
db: "admin"
}]
})
重新以验证模式启动mongod服务
net stop mongodb #停止服务
mongod --remove #卸载服务
mongod.exe --install --auth --dbpath 磁盘路径 --logpath 日志路径
net start mongodb #启动服务
通过超级管理员账号登录
mongo 服务器 IP 地址:端口/数据库 -u 用户名 -p 密码
登录之后输入,先选择admin数据库在db.auth
db.auth('admin','admin888')
【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"
}]
})
MongoDB的索引
情景设置
向数据库新增十万条数据测试
//选择数据库
use test;
//向数据库中添加数据
for(var i=0;i<100000;i++){
db.data1.insert({'name':"aaa"+i,"age":i});
}
索引的建立
语法
创建索引语法: db.集合名.createIndex(待创建索引的列,[额外选项])
待创建索引的列语法: {键1,键2} 说明 1-升序 -1 降序
额外选项: 设置索引,声明唯一索引等
删除索引语法:
全部删除: db.集合名.dropIndexes();
删除指定: db.集合名.dropIndex(索引名)
查看索引语法: db.集合名.getIndexes();
创建普通索引
db.data1.createIndex({name:1}) #给name添加索引
db.data1.dropIndex('name_1') #删除name索引
db.data1.createIndex({name:1}, {name:'xx'}) #创建name索引,改名为xx
创建复合/组合索引
需求: 给name和age添加组合索引
说明: 就是一次性给两个字段建立索引
语法:db.集合名.createIndex({键1:方式,键2:方式})
db.data1.createIndex({name:1, age:1});
创建唯一索引
db.data1.dropIndexes(); #删除所有索引
db.data1.createIndex({name:1}, {unique:"name"});增加唯一索引
数据库的备份和还原
备份数据库
导出数据语法:mongodump -h -port -u -p -d -o
-h host 服务器ip地址(注:可不写则默认本机)
-port 端口(注:可不写则默认27017)
-u user 用户名(注:开启验证模式才必写)
-p passwd 密码(注:开启验证模式才必写)
-d database 数据库(注:不写则备份全部数据库)
-o open 备份到指定目录下
备份所有数据:
mongodump -u admin -p admin888 -o C:\itcast\mongodb\bak
备份指定数据
mongodump -u shop1 -p admin888 -d shop -o C:\itcast\mongodb\bak2
还原数据库
导出数据语法:mongorestore -h -port -u -p -d --drop 备份数据目录
-h host 服务器ip地址(注:可不写则默认本机)
-port 端口(注:可不写则默认27017)
-u user 用户名(注:开启验证模式才必写)
-p passwd 密码(注:开启验证模式才必写)
-d database 数据库(注:不写则还原全部数据库)
--drop 先删除数据再恢复
还原所有数据
mongorestore -u admin -p admin888 --drop C:\itcast\mongodb\bak
还原指定数据库
mongorestore -u shop2 -p admin888 --drop C:\itcast\mongodb\bak2
PHP操作MongoDB
开启mongo扩展
通过phpinfo()查看php相关信息,便于选择扩展文件
根据相关信息选择扩展文件
下载地址:https://pecl.php.net/package/mongo/1.6.14/windows
将下载的dll文件到本地并放到php的ext目录下,然后引入扩展,并重启服务
在php.ini中 开启扩展 添加
extension=php_mongo.dll
在通过phpinfo验证是否开启成功
在PHP中操作数据
PHP添加数据
数据库名->集合名->insert(数组)
$rs = $mongodb->php13->c1->insert([
'name' => 'xiaoze',
'age' => 18
]);
var_dump($rs)
PHP修改数据
#修改数据
$mongodb = new MongoClient ("mongodb://admin:admin888@localhost");
#资源->数据库->集合(文档)->方法
$rs = $mongodb->php15->class->update(
['name'=>'123456'],
[
'$set'=>['name'=>'xiaoze'],
'$inc'=>['age' => 10]
]
);
var_dump($rs);
PHP输出数据
$mongodb = new MongoClient ("mongodb://admin:admin888@localhost");
$rs = $mongodb->php15->class->find();
foreach($rs as $c1){
echo $c1['name']."__";
echo $c1['age']."
";
}
PHP删除数据
$mongodb = new MongoClient ("mongodb://admin:admin888@localhost");
# 删除数据
$rs = $mongodb ->php15->class->remove([
'name' => '123456',
]);
var_dump($rs);