一.NoSQL的介绍
1.1什么是NoSQL?
NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
1.2 NoSQL的优点/缺点
优点:
- 高可扩展性
- 分布式计算
- 低成本
- 架构的灵活性,半结构化数据
- 没有复杂的关系
缺点: - 没有标准化
- 有限的查询功能(到目前为止)
- 最终一致是不直观的程序
1.3NoSQL 数据库分类
(1)列存储
Hbase
Cassandra
Hypertable
顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。
(2)文档存储
MongoDB
CouchDB
文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。
(3)key-value存储
Tokyo Cabinet / Tyrant
Berkeley DB
MemcacheDB
Redis
可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能)
(4)图存储
Neo4J
FlockDB
图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。
1.4谁在使用
现在已经有很多公司使用了 NoSQL:
Google
Facebook
Mozilla
Adobe
Foursquare
LinkedIn
Digg
McGraw-Hill Education
Vermont Public Radio
二.mongodb的介绍
2.1什么是Mongodb?
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
2.2 mongodb核心的概念
2.3 mongodb的注意事项
1)文档中的键/值对是有序的。
2)文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
3)MongoDB区分类型和大小写。
4)MongoDB的文档不能有重复的键。
5)文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
三.mongodb的安装
3.1windows下安装Mongodb
第一步:获取软件包
第二步:安装mongodb
第三步:手动安装mongodb的启动服务
新建一个存储数据库和日志的目录php7mongodb
找到mongodb的安装路径
以管理员的方式进入cmd
有时候会加上 --journal,或者服务启动失败换一个安装包,我的是系统版本的原因
第四步:安装成功之后查看一下启动服务(开启服务)
第五步:如何使用mongodb
第六步:设置环境变量
请注意,你必须有管理员权限才能运行cmd下面的命令。执行以下命令将MongoDB服务器作为Windows服务运行:
mongod.exe --dbpath=“E:\php7mongodb\db” --logpath =“E:\php7mongodb\log\log.txt” --install
下表为mongodb启动的参数说明:
参数 描述
–bind_ip 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP
–logpath 定MongoDB日志文件,注意是指定文件不是目录
–logappend 使用追加的方式写日志
–dbpath 指定数据库路径
–port 指定服务端口号,默认端口27017
–serviceName 指定服务名称
–serviceDisplayName 指定服务名称,有多个mongodb服务时执行。
–install 指定作为一个Windows服务安装
3.2 linux中mongodb的安装
第一步:获取安装包
第二步:上传mongdb安装包并解压缩
第三步:将解压缩包移动到/usr/local/mongodb目录下
第四步:启动mongod服务器端
第五步:创建数据库的存储目录(data)和日志的存储目录(log)
第六步:创建一个加载的文件mongod.ini
vim mongod.ini
dbpath:数据库路径
logpath:日志路径
第七步:开启mongodb的服务器端
第八步:登录mongod的客户端
四.数据库的操作
4.1快速的体验
具体实例1:查看所有的数据库和新建一个数据库和查看当前的数据库
具体实例2:创建表添加数据和查看数据库
具体实例3:查看数据库和表
4.2 MongoDB后台管理 Shell
进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo.exe文件,MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。
4.3 数据库的增删改查
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
(1)创建数据库
use databasename
如果库没有则创建,有则切换到使用的数据库。
如果不在库中增加集合或文档,则库还会消失。
如果创建了集合文档,库就会被自动创建。
(2)删除数据库
use database();
db.dropDatabase():注意大小写。
具体实例:删除数据库
(3)查看数据库
show dbs:查看所有的数据库。
db:查看当前的数据库。
具体实例:
(4)查看数据库的状态
db.stats()
具体实例:
五.数据库表(集合)的操作
5.1 创建表
语法说明:
db.createCollection(‘collectionname’)
具体实例:创建一个user表
5.2 修改表
语法说明:
db.oldCollection.renameCollection(‘newCollection’)
具体实例:给表改名称
5.3 查看表
语法说明:
show collections;
show tables;
具体实例:
5.4 删除表
语法说明:
db.collectionname.drop()
具体实例:
六.文档对象的操作(CURD:增删改查)
所有存储在集合中的数据都是BSON格式。
BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON。
6.1添加数据
MongoDB 使用 insert() 或 save() 方法向集合中插入文档,
语法如下:
db.COLLECTION_NAME.insert(document)
具体实例:添加数据
6.2查看数据
db.COLLECTION_NAME.find()
find() 方法以非结构化的方式来显示所有文档。
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
db.col.find().pretty()
具体实例1:查看数据的时候,隐藏主键id
具体实例2:以易读的格式显示数据
具体实例3:查看某一条数据
6.3修改数据
语法如下:
db.collection.update(
query,
update,
{
upsert: ,
multi: ,
})
参数说明:
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如
s
e
t
,
set,
set,inc…)等,
upsert : 如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
具体实例1:简单修改
具体实例2:如果你修改的条件不存在,那么后面修改的内容变成添加
具体实例3:怎样修改多条记录
db.user.update({name:‘张昭’},{$set:{name:‘刘表’}},{multi:true})
multi:true,修改多条记录
6.4删除数据
语法说明:
remove({条件})
删除一条重复数据:justOne:ture
删除所有:remove({})
具体实例1:简单删除
具体实例2:多条删除
具体实例3:删除一条重复的数据{justOne:true}
七.数据库索引
索引:提高网站的查询效率,给字段加索引
索引的分类:
普通索引
唯一索引
7.1 添加索引
db.collectionname.ensureIndex({key:1});
语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。
具体实例1:给一个字段创建一个普通索引
具体实例2:创建一个唯一索引{unique:true}
具体的应用:不能添加重复的数据
7.2 查看索引
db.collectionname.getIndexes()
具体实例1:查看索引
7.3 删除索引
语法说明:
db.collectionname.dropIndex(‘索引的名称’);
具体实例:
八.文档对象的条件运算符
8.1 关系运算符
1)
g
t
:
大
于
2
)
gt:大于 2)
gt:大于2)lt:小于
3)
g
t
e
:
大
于
等
于
4
)
gte:大于等于 4)
gte:大于等于4)lte:小于等于
5)
n
e
:
不
等
于
6
)
ne:不等于 6)
ne:不等于6)eq:等于
具体实例1:
db.user.find({age:{
g
t
e
:
25
,
gte:25,
gte:25,lte:30}})
具体实例2:年龄等于32
7)KaTeX parse error: Expected '}', got 'EOF' at end of input: …n:在某个集合中 具体实例:{in: [25, 26,32]}
8)KaTeX parse error: Expected '}', got 'EOF' at end of input: …:不在某个集合中 具体实例:{nin: [25, 26,32]}
9)KaTeX parse error: Expected '}', got 'EOF' at end of input: …ists:是否存在某个属性 {exists:false},某个属性是否存在。
具体实例:
8.2 正则运算符
{属性: 正则表达式对象}
/正则表达式/
具体实例:
db.user.find({name:/^p/})
8.3 逻辑运算符
KaTeX parse error: Expected '}', got 'EOF' at end of input: and运算符 语法:{and: [条件1, 条件2]}。
具体实例:
KaTeX parse error: Expected '}', got 'EOF' at end of input: or运算符 语法:{or: [条件1, 条件2]}。
具体实例:db.user.find({$or:[{name:‘郭嘉’},{age:25}]})
KaTeX parse error: Expected '}', got 'EOF' at end of input: …er.find({name:{not:{KaTeX parse error: Expected 'EOF', got '}' at position 8: eq:'贾诩'}̲}}); ![在这里插入图片描…where)
数组
数组索引对应匹配, property.index
‘属性.index’, 表示该索引值的元素,
具体实例:
对象的:KaTeX parse error: Expected '}', got 'EOF' at end of input: … db.user.find({where:function(){
if(this.age>=26){
return true;
}
else{
return false;
}
}},{’_id’:false});
具体实例:
8.6 查询的条件(查询全部,去掉id号)
查询全部数据,去掉id号。
db.user.find({},{_id:false})
具体实例:
8.7 其他查询的条件
limit(number):显示几条数据
具体实例:
skip(number):跳过几条数据
具体实例1:
具体实例2:
sort():排序
具体实例:sort({age:1}) 1:升序,-1:降序
count():记录数
具体实例:
distinct():消除重复 的数据
具体实例:
九.文件的修改操作
(1)$set:修改字段的值
具体实例:
(2)
u
n
s
e
t
:
删
除
某
个
字
段
具
体
实
例
:
!
[
在
这
里
插
入
图
片
描
述
]
(
h
t
t
p
s
:
/
/
i
m
g
−
b
l
o
g
.
c
s
d
n
i
m
g
.
c
n
/
20190314124338761.
p
n
g
)
(
3
)
unset:删除某个字段 具体实例: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190314124338761.png) (3)
unset:删除某个字段具体实例:![在这里插入图片描述](https://img−blog.csdnimg.cn/20190314124338761.png)(3)inc:递增递减数据
具体实例:
(4)
p
u
s
h
:
向
数
组
中
添
加
一
条
数
据
具
体
实
例
:
!
[
在
这
里
插
入
图
片
描
述
]
(
h
t
t
p
s
:
/
/
i
m
g
−
b
l
o
g
.
c
s
d
n
i
m
g
.
c
n
/
20190314124438362.
p
n
g
)
(
5
)
push:向数组中添加一条数据 具体实例: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190314124438362.png) (5)
push:向数组中添加一条数据具体实例:![在这里插入图片描述](https://img−blog.csdnimg.cn/20190314124438362.png)(5)pushAll:向数组添加多条数据
具体实例:
(6)$pull:从数组中拉出数据
具体实例:
(7)$pullAll:从数组中拉出多条数据
具体实例:
(8)$pop:删除数据
将数组中最后一个元素弹出栈!
具体实例:
(9)$addToSet:加入到数组
具体实例:
十.PHP操作mongodb
10.1 window上安装 MongoDB PHP扩展
第一步:获取扩展安装包
第二步:给php添加扩展
第三步:在php.ini中添加扩展
第四步:重启服务器
第五步:查看扩展
10.2 linux上安装 MongoDB PHP扩展
第一步:获取扩展安装包
上传文件
第二步:解压缩安装,使用Phpize安装扩展
第三步:编译安装
./configure && make && make install
在php.ini中添加扩展
第四步:关闭防火墙重启apache服务器
第五步:查看扩展
10.3 php 连接mongodb
port:27017
10.4 php 添加mongodb数据
10.5 php 查看mongodb数据
十一.MongoDB ObjectId
ObjectId 是一个12字节 BSON 类型数据,有以下格式:
前4个字节表示时间戳
接下来的3个字节是机器标识码
紧接的2两个字节由进程id组成(PID)
最后3三个字节是随机数。
MongoDB中存储的文档必须有一个"_id"键。这个键的值可以是任何类型的,默认是个ObjectId对象
隐藏id号:
db.mongophp.find({},{’_id’:false});
分开写。