数据库(Database)
- 数据库是按照数据结构来组织、存储和管理数据的仓库。
- 我们的程序都是在内存中运行的,一旦程序运行结束或者计算机断电,程序运行中的数据都会丢失 。
- 所以我们就需要将一些程序运行的数据持久化到硬盘中 ,以确保数据的安全性。而数据库就是数据持久化的最佳选择。
- 说白了,数据库就是存储数据的仓库。
数据库分类
数据库主要分成两种:
- 关系型数据库(RDBMS)
- MySQL、Oracle、DB2、SQL Server…
- 关系数据库中全部都是表
- 非关系型数据库(No SQL)
- MongoDB、Redis…
- 键值对数据库
- 文档数据库MongoDB
MongoDB简介
- MongoDB是为快速开发互联网 Web应用而设计的数据库系统 。
- MongoDB的设计目标是极简、灵活 、作为Web应用栈的一部分。
- MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,简单理解MongoDB这个数据库中存的 是各种各样的JSON.(BSON)
三个概念
- 数据库(database)
- 数据库是一个 仓库,在仓库中可以存放集合。
- 集合(collection)
- 集合类似于数组,在集合中可以存放文档。
- 文档(document)
- 文档数据库中的最小单位,我们存储和操作内容都是文档。
下载MongoDB
- 下载地址 https://www.mongodb.com/download-center
- MongoDB的版本偶数版本号位稳定版,奇数版本为开发版。
- MongoDB对于32位系统支持不佳,所以3.2版本以后没有再对32位系统的支持。
安装MongoDB
- 安装,下载应用程序,直接傻瓜式下一步安装即可。
- 配置环境变量
- C:\Program Files\MongoDB\Server\4.0\bin
- 在c盘根目录下
- 创建一个文件夹data
- 在data中创建一个文件夹db
- 打开cmd命令行窗口
- 输入 mongod启动 mongodb 服务器
- 32位注意:
- 启动 服务器时,需要输入如下内容
mongod -storageEngine=mmapvl
- 启动 服务器时,需要输入如下内容
- 在重新打开一个cmd窗口
- 输入 mongo 连接mongodb, 出现 > 说明安装成功
- 更改数据库数据存放路径
- mongod --dbpath 数据库路径 --port 端口号
- 数据库(database)
- 数据库的服务器
- 服务器用来保存数据
- mongod 用来启动服务器
- 数据库的客户端
- 客户端用来操作服务器,对数据进行怎删改查的操作
- mongo 启动客户端
- 数据库的服务器
- 将MongoDB设置为系统服务,可以自动在后台启动,不需要每次都手动启动
- 在c盘根目录创建data文件夹
- 在data目录下创建db和log文件夹
- 创建配置文件
- 在目录 C:\Program Files\MongoDB\Server\4.0 下添加一个配置文件
- 在桌面上创建一个 mongod.cfg 文件,里面内容如下
-
systemLog: destination: file path: c:\data\log\mongod.log storage: dbPath: c:\data\db
- 在目录 C:\Program Files\MongoDB\Server\4.0 下添加一个配置文件
- 以管理员的身份打开命令行窗口
- 执行如下的命令
-
sc.exe create MongoDB binPath= "\"C:\Program Files\MongoDB\Server\4.0\bin\mongod.exe\" --service --config=\"C:\Program Files\MongoDB\Server\4.0\mongod.cfg\"" DisplayName= "MongoDB" start= "auto" # 输入上面命令即可,更改路径参考如下 sc.exe create MongoDB binPath= "\"mongodb的bin目录\mongod.exe\" --service --config=\"mongodb的安装目录\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
- 启动mongodb服务(右键 任务管理器 服务 mongodb服务 右键 启动)
- 下次不用在手动启动服务,直接连接即可
- 如果启动失败,上述操作有误,在控制台输入 sc delete MongoDB删除之前配置的服务,重新安装
- 在c盘根目录创建data文件夹
基本指令
常用指令
在MongoDB中,数据库和集合都不需要手动创建,当我们创建文件时,如果文档所在的集合或数据库不存在会自动创建数据库和集合
- mongod 开启数据库
- mongo 连接数据库
- show dbs & show databases 显示当前所有数据库
- use test 进入/切换数据库
- db 表示当前所处数据库
- show collections 显示数据库中的所有集合
数据库的CRUD(增删改查)的操作
- 向集合中中插入文档
- db..insert(doc)
- db..insertOne()
- db..insertMany()
- 向集合中插入一个或者多个文档
- 当我们向集合中插入文档时,如果没有给文档指定 id 属性,则数据库会自动为文档添加 _id,该属性用来作为文档的唯一标识
- _id 我们可以自己指定,如果我们制定了数据库就不会在添加了,如果自己自定 _id 也必须确保唯一性
- 例子:向test数据库中的stus集合中插入一个新的学生对象
- db.stus.insert({name: ‘孙悟空’})
- db.students.insert({_id: “hello”,name: “猪八戒”,age: 23,gender: “男”}) 指定id
-
db.students.insert([ {name: "猪八戒1",age: 231,gender: "男"}, {name: "猪八戒3",age: 23,gender: "男"} ])
- 查询数据
- db..find()
- find()查询当前集合中的所有符合条件的文档
- find()中可以接收一个对象作为条件参数
- find({}) 标识查询集合中所有的文档
- find({字段名:值}) 查询属性是指定值的文档
- 返回的是一个数据组
- 案例:
- db.students.find({_id:“hello”})
- db.students.find({_id:“hello”,name: “猪八戒”})
- db..findOne()
- 用来查询集合中符合条件的第一个文档
- findOne()返回的是一个文档对象
- db..find({}).count()
- 查询所有结果的数量
- db..find()
- 修改数据
- db.collection.update(查询条件,新对象)
- update() 默认情况下会使用新对象来替换旧的对象,例如
- db.students.update({_id: “hello”},{age: 0})
- 如果需要修改指定的属性,而不是替换需要使用“修改操作符 $set”来完成修改
- $set可以用来修改文档中指定的属性
- db.students.update({age: 231},{$set: {name: “xxx”, address: “111”}})
- $unset 可以用来删除文档的指定属性
- db.students.update({age: 231},{$unset: {address: “111”}})
- update()默认只会修改一个
- update()修改多个
- db.students.update({“name”: “哈哈”},{$set: {address: “哈哈哈”}},{multi: true})
- $set可以用来修改文档中指定的属性
- update() 默认情况下会使用新对象来替换旧的对象,例如
- db..updateMany()
- 同时修改多个符合条件的文档
- db.students.updateMany({age: 231},{$set: {age: 0, address: “111”}})
- 同时修改多个符合条件的文档
- db..updateOne()
- db.collection.update(查询条件,新对象)
- 删除数据
- db..remove({})
- remove()可以根据条件来删除文档,传递条件的方式和find()一样
- 删除符合条件的所有文档(默认情况下回删除多个)
- 如果remove()第二个参数传递一个true,则只会删除一个
- 如果只传递一个空对象,就会删除集合中的所有数据
- db..deleteOne()
- db..deleteMany()
- db..drop() 删除集合
- db.dropDatabase() 删除数据库
- 一般数据库中的数据都不会删除,所以删除的方法很少调用
- 一般会在数据中添加一个字段,来表示数据是否被删除
- db..remove({})
MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是一个文档时,我们称为这个文档叫做 内嵌文档
db.users.update({username: "tangseng"}, {$set: {hobby: {citys: ['上海','北京','广州'],movies: ['sanguo','hero']}}})
MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过.的形式
如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号
db.users.find({'hobby.movies': 'hero'})
$push用于向数组中添加一个新元素
$addToSet向数组中添加一个新元素,如果数组中已经存在了该元素,则不会添加
db.users.update({username: "tangseng"},{$push: {"hobby.movies": "Interstellar"}})
db.users.update({username: "tangseng"},{$addToSet: {"hobby.movies": "Interstellar"}})
向数据库中插入20000条数据
var arr = []
for(var i = 1 ; i <= 20000 ; i++){
arr.push({num: i})
}
db.numbers.insert(arr)
查询操作符的使用
db.numbers.find({num: {$gt: 30}}) # 大于
db.numbers.find({num: {$lt: 30}}) # 小于
db.numbers.find({num: {$eq: 30}}) # 等于
$lte # 小于等于
$gte # 大于等于
{num: {$gt: 40, $lt: 50}} # 大于40小于50
db.numbers.find().limit(10) # 显示前10条数据
db.numbers.find().skip(10).limit(10) # 查询第11-20条数据 skip()用于跳过指定数量的数据
skip((页码-1) * 每页显示的条数).limit(每页显示的条数)
db.emp.find({$or: [{sal: {$lt: 1000}}, {sal: {$gt: 2500}}]}) # 小于1000或者大于2500
# sort()可以用来指定文档的拍讯的规则,sort()中需要传递一个对象来指定排序规则,1升序,-1降序
db.emp.find().sort({sal: 1}); # 按照薪资 sal 排序,
db.emp.find().sort({sal: 1, age: -1})
# limit skip sort 可以以任意的顺序进行调用
# 在查询时,可以在第二个参数的位置来设置查询结果的 投影
db.emp.find({},{ename: 1, _id: 0}) # 只显示ename字段
文档之间的关系
- 一对一(one to one)
- 夫妻(一个丈夫 对应 一个妻子)
- 在MongoDB,可以通过内嵌文档的形式来体现出一对一的关系
- 一对多(one to many )/ 多对一 (many to one)
- 父母 孩子
- 用户 订单
- 文章 评论
- 也可以通过内嵌文档来映射一对多的关系
- 多对多(many to many)
- 分类 商品
- 老师 学生
MongoDB图形化界面工具的安装
下载地址1:https://en.freedownloadmanager.org/Windows-PC/NoSQL-Manager-for-MongoDB.html
下载地址2:https://en.freedownloadmanager.org/Windows-PC/MongoChef.html