视频链接:https://www.bilibili.com/video/BV18s411E78K/?spm_id_from=333.337.search-card.all.click&vd_source=9545770e4a2968c05878ffac8589ec6c
视频选集:P1— P13
文章目录
1.数据库简介
- 数据库是按照数据结构来组织、存储和管理数据的仓库。
- 我们的程序都是在内存中运行的,一旦程序运行结东或者计算机断电,程序运行中的数据都会丢失。
- 所以我们就需要将一些程序运行的数据持久化到硬盘之中,以确保数据的安全性。而数据库就是数据持久化的最佳选择。·
- 说白了,数据库就是存储数据的仓库。
数据库分类:
- 关系型数据库(RDBMS)
MySQL、Oracle、DB2、SQL Server …
关系数据库中全都是表 - 非关系型数据库(NoSQL not only SQL)
MongoDB、Redis
键值对数据库
文档数据库MongoDB
2.MongoDB简介
- MongoDB是为快速开发互联网Web应用而设计的数据库系统。
- MongoDB的设计目标是极简、灵活、作为Web应用栈的一部分。
- MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,简单理解MongoDB这个数据库中存的是各种各样的JSON。(BSON )
三个概念:
- 数据库( database ):数据库是一个仓库,在仓库中可以存放集合。
- 集合( collection ):集合类似于数组,在集合中可以存放文档。
- 文档(document ):文档数据库中的最小单位,我们存储和操作的内容都是文档。
- 下载地址: https://www.mongodb.org/dI/win32/
- MongoDB的版本偶数版本(比如:3.2 3.4 3.6)为稳定版,奇数版本为开发版。
- MongoDB对于32位系统支持不佳,所以3.2版本以后没有再对32位系统的支持。
安装步骤:
数据库(database)
- 数据库的服务器
服务器用来保存数据-
-mongod用来启动服务器 - 数据库的客户端
客户端用来操作服务器,对数据进行增删改查的操作
-mongo用来启动客户端
3.将MongoDB设置为系统服务
将MongoDB设置为系统服务,可以自动在后台启动, 不需要每次都手动启动
4.MongoDB的基本操作
- 数据库( database ):数据库是一个仓库,在仓库中可以存放集合。
- 集合( collection ):集合类似于数组,在集合中可以存放文档。
- 文档(document ):文档数据库中的最小单位,我们存储和操作的内容都是文档。
注意:在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合
基本指令:
- show dbs(或者show databases)-显示当前的所有数据库
- use 数据库名 -进入到指定的数据库中db
- db 表示的是当前所处的数据库
- show collections -显示数据库中所有的集合
数据库的CRUD(增删改查)的操作:
5.安装图形化工具
6.插入文档
向集合中插入一个文档:
向集合中插入多个文档:
注意:当我们向集合中插入文裆时,如果没有给文档指定_id属性,则数据库会自动为文档添加_id,该属性用来作为文档的唯一标识
id也可以自我指定:【如果我们指定了数据库就不会在添加了,如果自己指定_id也必须确保它的唯一性】
db.collection.insertone ():插入一个文档对象
db.collection.insertMany ():插入多个文档对象
这两个方法是上面db.collection.insert ()的拆分,只不过一个传入值为单个,一个传入值为数组
7.查询文档
find():查询集合中所有符合条件的文档【返回的是一个数组】
按单个条件查询:
按多个条件查询:
满足条件的第一个:
findOne():返回的是一个文档对象
查询所有结果(文档)的数量:
8.修改文档
8.1 update()
update()默认情况下会使用新对象来替换旧的对象
$set 可以用来修改文档中的指定属性
$unset 可以用来删除文档的指定属性:
需求:删除沙和尚的地址
注意:update()默认只会修改一个
设置参数修改多个:
8.2 updateMany()
updateMany()可以修改多个
8.3 updateOne()
updateOne()只会修改一个
8.4 replaceOne()
替换一个文档
9.删除文档
- db.collection.remove ():
可以根据条件来删除文档,传递的条件的方式和find( )一样
删除符合条件的所有的文档
remove ({}):如果只传递一个空对象,作为参数,则会删除集合中的所有的文档【清空集合(性能略差)】
【清空集合最好用db.集合名.drop()】 - db.collection.deleteone ()
- db.collection.deleteMany ( )
- db.collection.drop():删除集合
- db.dropDatabase():删除数据库
只删除一个:
如果remove()第二个参数传递一个true,则只会删除一个
注意:一般数据席中的数据都不会删除,所以制除的方法很少调用【一般会在数据中添加一个字段,来表示数据是否被删除】
10.练习1
1.进入my_test数据库
use my_test
2.向数据库user集合中插入一个文档
db.users.insert({
username:"sunwukong"
});
3.查询user集合中的文档
db.users.find () ;
4.向数据库的user集合中插入一个文格
db.users.insert ({
username:" zhubajie"
});
5.查询数据席user集合中的文档
db.users.find () ;
6.统计数据席user集合中的文档数量
db.users.find().count() ;
7.查询数据席user集合中username为sunwukong的文档
ab.users.find({username:"sunwukong"});
8.向数据席user集合中的username为 sunwukong的文档,添加一个address属性,属性值为 huaguoshan
db.users.update({username:"sunwukong" },{$set:{address:"huagjoshan"}}) ;
9.使用{username:"tangseng"} 替换username为zhubajie的文档
db.users.replaceone({username:"zhubajie"}, {username:"tangseng" });
10.删除username为sunwukong的文档的address属性
db.users.update ({username:"sunwukong"},{$unset:{address:1}});
11.向username为sunwukong的文档中,添加一个hobby:{cities:["beijing","shanghai","shenzhen"], movies: ["sanguo","hero"]}
///MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是一个文档时,我们称这个文档叫做内嵌文档
db.users.update ({username:"sunwukong"},{$set:{hobby:{cities:["beijing","shanghai","shenzhen"], movies: ["sanguo","hero"]}}});
12.向username为tangseng的文档中,添加一个hobby:{movies:[ "A Chinese Odyssey","King of comedy"]}
db.users.update({username:"tangseng" },{$set:{hobby:{movies:[ "A Chinese Odyssey","King of comedy"]}}})
13.查询喜欢电影的hero的文档
//MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过﹒的形式来匹配
//如栗要通过内嵌文档来对文档进行查询,此时属性名必须使用引号 双引号和单引号都行
db.users.find({"hobby.movies":"hero"}) ;
14.向tangseng中添加一个新的电影Interstellar
//$push 用于向数组中添加一个新的元素,无论是否重复还是会添加
//$addToSet向数组中添加一个新元素,如果数组中已经存在了该元素,则不会添加
db.users.update({username:"tangseng"),{$push:{"hobby.movies":"Interstellar"}});
db.users.update({username:"tangseng"),{$addToSet:{"hobby.movies":"Interstellar"}});
15.删除beijing的用户
db.users.remove({"hobby.cities":"beijing"});
16.删除user集合
db.users.remove({});
db.users.drop();
17.向numbers中插入20000条数据
// 第一种方法: 7.2s
for(var i=1; i<=20000; i++){
db.numbers.insert({num:i});
}
// 第二种方法: 0.4s
var arr =[ ];
for (var i=l; i<=20000 ; i++){
arr.push({num:i});
}
db.numbers.insert(arr) ;
11.练习2
18.查询numbers中num为500的文档
db.numbers.find({num:500})
db.numbers.find({num:{$eq:500}});//一般不经常用,直接写就行
19.查询numbers中num大于5000的文档
db.numbers.find({num:{$gt:5000}});
20.查询numbersp中num小于30的文档
db.numbers.find({num:{$lt:30}});
21.查询numbers中num大于40小于50的文档
db.numbers.find({num:{$gt:40,$lt:50}});
22.查询numbers中num大于19996的文档
db.numbers.find({num:{$eq:19996}});
23.查看numbers集合中的前10条数据
db.numbers.find({num:{$lte:10}});//但是有局限性
//limit()设置显示数据的上限
db.numbers.find().limit(10);
//在开发时,绝对不会执行不常条件的查询,通常使用limit进行分页展示
db.numbers.find() ;
24.查看numbers集合中的第11条到20条数据
//skip()用于跳过指定数量的数据
//skip((页码一1)*每页显示的条数.limit(每页显示的条数);
//MongoDB会自动调整skip和 limit的位置,两个前后无所谓
db.numbers.find().skip(10).limit(10);
25.查看numbers集合中的第21条到30条数据
db.numbers.find().skip(20).limit(10);
12.文档间的关系
- 一对一( one to one)
- 一对多( one to many)/多对一(many to one)
- 多对多(many to many)
12.1 一对一
夫妻(一个丈夫 对应 一个妻子)【在 MongoDB,可以通过内嵌文档的形式来体现出一对一的关系】
12.2 一对多/多对一
父母-孩子
用户-订单
文章-评论
【也可以通过内嵌文档来映射一对多的关系】
查找用户swl的订单:
12.3 多对多
分类-商品
老师-学生
13.练习3
先导入数据
26.将dept和emp集合导入到数据库中
27.查询工资小于2000的员工
db.emp.find({sal:{$lt:2000}});
28.查询工资在1000-2000之间的员工
db.emp.find({sal:{$lt:2000,$gt:1000}}) ;
29.查询工资小于1000或大于2500的员工
db.emp.find({$or:[{sal:{$lt:1000}},{sal:{$gt:2500}}]});
30.查询财务部的所有员工
//depno
var depno = db.dept.findone({dname:"财务部"}).deptno;
db.emp.find({depno:depno});
31.查询销售部的所有员工
var depno = db.dept.findone({dname:"销售部"}).deptno;
db.emp.find({depno:depno});
32.查询所有mgr为7698的所有员工
db.emp.find({mgr:7698});
33.为所有薪资低于1000的员工增加工资400元
db.emp.updateMany({sal:{$lte:1000}},{$inc:{sal:400}});