NoSQL-MongDB简介

一、关系型数据库和非关系型数据库

1.1 关系型数据库RDBMS(Relational DataBase Management System)

  • 关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

  • 关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。

  • 当前主流的关系型数据库有Oracle、MySQL、Microsoft SQL Server、PostgreSQL、DB2等。

1.2 非关系型数据库NoSQL(Not Only SQL)

  • NoSQL最早出现于1998 年,是由Carlo Storzzi最早开发的个轻量、开源、不兼容SQL 功能的关系型数据库,2009 年,在一次分布式开源数据库的讨论会上,再次提出了NoSQL 的概念,此时NoSQL主要是指非关系型、分布式、不提供ACID (数据库事务处理的四个基本要素)的数据库设计模式。同年,在亚特兰大举行的“NoSQL(east)”讨论会上,对NoSQL 最普遍的定义是“非关联型的”,强调Key-Value 存储和文档数据库的优点,而不是单纯地反对RDBMS,至此,NoSQL 开始正式出现在世人面前。

  • 非关系型数据库:指非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统。

  • 非关系型数据库以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。

1.3 关系型与非关系型数据库的比较

二、MongoDB简介

MongoDB官网

2.1 MongoDB简单介绍

  • MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。MongoDB是基于文档而存储的,是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似Json的Bson格式,因此可以存储比较复杂的数据类型。

  • MongoDB没有结构化语言。模式自由(schema-free),意味着对于存储在MongoDB数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

  • Mongo主要解决的是海量数据的访问效率问题。因为Mongo主要是支持海量数据存储的,所以Mongo还自带了一个出色的分布式文件系统GridFS,可以支持海量的数据存储。由于Mongo可以支持复杂的数据结构,而且带有强大的数据查询功能,因此非常受到欢迎。

2.2 MongoDB的特点

  • 文档数据类型
    MongoDB是一个面向文档的数据库,它并不是关系型数据库,直接存取Bson,这意味着MongoDB更加灵活,因为可以在文档中直接插入数组之类的复杂数据类型,并且文档的key和value不是固定的数据类型和大小,所以开发者在使用MongoDB时无须预定义关系型数据库中的“表”等数据库对象,设计数据库将变得非常方便,可以大大地提升开发进度。

  • 扩展性
    在扩展性方面,假设应用数据增长非常迅猛的话,通过不断地添加磁盘容量和内存容量往往是不现实的,而手工的分库分表又会带来非常繁重的工作量和技术复杂度。在扩展性上,MongoDB有非常有效的,现成的解决方案。通过自带的Mongos集群,只需要在适当的时候继续添加Mongo分片,就可以实现程序段自动水平扩展和路由,一方面缓解单个节点的读写压力,另外一方面可有效地均衡磁盘容量的使用情况。整个mongos集群对应用层完全透明,并可完美地做到各个Mongos集群组件的高可用性。

  • 数据压缩
    自从MongoDB 3.0推出以后,MongoDB引入了一个高性能的存储引擎WiredTiger,并且它在数据压缩性能上得到了极大的提升,跟之前的MMAP引擎相比,压缩比至少可增加5倍以上,可以极大地改善磁盘空间使用率。

2.3 什么时候使用MongoDB?

  • 我的数据量是有亿万级或者需要不断扩容
  • 需要2000-3000以上的读写每秒
  • 新应用,需求会变,数据模型无法确定
  • 我需要整合多个外部数据源
  • 我的系统需要99.999%高可用
  • 我的系统需要大量的地理位置查循
  • 我的系统需要提供最小的延迟时间
  • 我要管理的主要数据对象<10

2.4 安装MongoDB

MongoDB下载地址

  • 下载对应版本和操作系统的MSI文件或ZIP文件
  • 配置环境变量
    在环境变量的path中添加MongoDB的bin文件路径,如D:\MongoDB\bin
  • 打开cmd
    -- 输入mongod启动MongoDB数据库的服务端
    -- 输入mongo启动MongoDB数据库的客户端
  • 出现则配置成功!

2.5 MongoDB基本概念

  • 数据库(database)
    一个集合的物理容器。一个单一的MongoDB服务器通常有多个数据库。
  • 集合(collection)
    集合就是一组文档。如果说MongoDB中的文档类似于关系型数据库中的行,那么集合就如同表。
  • 文档(document)
    文档是MongoDB的核心概念。多个键及其关联的值有序的放置在一起便是文档。

2.6 MongoDB基本命令

  • show dbs / show databases
    显示所有的数据库

  • use database_name
    进入指定的数据库

  • show collections
    显示数据库中的所有集合

  • db
    显示当前所在的数据库

三、MongoDB CRUD Operations

MongoDB官方文档

3.1 Create Operations

3.1.1 db.collection.insertOne()

---函数说明:


---示例:

执行语句: db.products.insertOne( { item: “card”, qty: 15 } )

存储结果:{ “_id” : ObjectId(“5063114bd386d8fadbd6b004”), “item” : “card”, “qty” : 15 }

3.1.2 db.collection.insertMany()

---函数说明:

---示例:

3.1.3 db.collection.insert()
  • insert()insertOne()insertMany()的综合。

3.2 Read Operations

3.2.1 db.collection.findOne()

查询一条数据

---示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//查询第一条名字是aaa的数据
db.collection.findOne({name:"aaa"})

//查询第一条名字是aaa并且年龄是20岁的数据
db.collection.findOne({name:"aaa",age:20})

// 查询年龄小于20岁的第一条数据
db.collection.findOne({age:{$lt:20}})

// 查询年龄小于20岁或者年龄大于30岁的数据
db.collection.findOne(
{
$or:[
{age:{$lt:20}},
{age:{$gt:30}},
]
}
)

3.2.2 db.collection.find()

查询所有符合条件的数据

---示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 查询所有数据
db.collection.find()
db.collection.find({})

// 查询所有数据并返回数据量
db.collection.find().count()

//查询名字是aaa的所有数据
db.collection.find({name:"aaa"})

//查询名字是aaa并且年龄是20岁的所有数据
db.collection.find({name:"aaa",age:20})

// 查询年龄小于20岁的所有数据
db.collection.find({age:{$lt:20}})

// 查询年龄小于20岁或者年龄大于30岁的所有数据
db.collection.find(
{
$or:[
{age:{$lt:20}},
{age:{$gt:30}},
]
}
)

// 查询数据集中的前10条数据
db.collection.find().limit(10)

// 查询数据集中的10-20条数据
db.collection.find().skip(10).limit(10)

// 查询班级号为1的所有数据并对他们进行升序排列
db.collection.find({grade:1}).sort({score:1})

// 查询班级号为1的所有数据并对他们进行降序排列
db.collection.find({grade:1}).sort({score:-1})

条件运算符 含义
$gt >
$gte >=
$lt <
$lte <=
$ne !=
$eq ==

3.3 Update Operations

3.3.1 db.collection.update()

---默认只更改第一个查询到的数据,若要更改所有查询到的数据,需将multi设置为true。函数说明如下:

---示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 将名为aaa的第一条数据中的gender属性改为Male
// $set 表示 更改/设置属性
// upsert 表示若没有查询到该数据,则向数据库中插入{name:"aaa",gender:"Male"}的一条数据
db.collection.update(
{name:"aaa"},
{
$set:{gender:"Male"},
},
{
upsert:true,
}
)

// $unset 表示 删除属性,属性后面可以接任何值,一般为 1
db.collection.update({name:"aaa"},{$unset:{gender:1}})

// 更改所有gender为Male的数据的age属性,将age全部加2
// $inc 表示 自增
db.collection.update(
{
gender:"Male"
},
{
$inc:{age:2}
},
{
multi:true
},
)

3.3.2 db.collection.updateOne()

语义为更改第一个查询到的数据,语法同update()

3.3.3 db.collection.updateMany()

语义为更改查询到的所有符合条件的数据,语法同update()

3.4 Delete Operations

3.4.1 db.collection.deleteOne({filter})
  • 删除符合条件的第一条数据
3.4.2 db.collection.deleteMany({filter})
  • 删除符合条件的所有数据
3.4.3 db.collection.remove()

---示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 删除所有数据,{}是必须的
db.collection.remove({})

// 删除所有name为aaa的数据
db.collection.remove(
{name:"aaa"}
)

// 删除name为aaa的第一条数据
db.collection.remove(
{
name:"aaa"
},
{
justOne:true,
}
)

3.4.4 db.collection.drop()
  • 删除集合