NoSQL( MongoDB )

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字段以外的字段

支持运算符查询

运算符.png
db.c1.find(age:{$gt:5})   查询age大于5的数据
db.c1.find({age: {$in:[5,8,10]}}); 查询age是5.8.10的数据

MongoDB的权限机制

权限机制概述

说明: 在mongodb中用户属于数据库,也就是每个数据库都有自己的用户

用户.png

开启验证模式

开启验证模式: 名词 ,指用户需要账号密码才能登陆

a. 在不需要账号密码登陆的情况下,选择admin数据库创建超级管理员
b. 退出mongodb  停止服务  卸载服务
C. 安装需要身份验证的服务(也就是说安装时加上参数--auth)
添加超级管理员
use admin;

db.createUser({ 
    "user" : "admin",
    "pwd": "admin888",
    "customData" : {employeeId:"提示密码admin888"},
    "roles" : [{ 
    role: "root", 
    db: "admin" 
    }] 
})
角色.png
重新以验证模式启动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);

你可能感兴趣的:(NoSQL( MongoDB ))