一、数据库分类
- 关系型数据库(RDBMS)
- MySQL、Qracle、DB2、SQL Server ...
- 关系数据库中全部是表
- 非关系型数据库(NoSQL Not Only SQL)
- MongoDB、Redis ...
- 键值对数据库
- 文档数据库MongoDB
二、MongoDB
1、简介
- MongoDB 是为快速开发物联网 Web 应用而设计的数据库系统。
- MongoDB 的设计目标是极简、灵活、作为 Web 应用栈的一部分。
- MongoDB 的数据模型是面向文档的,所谓文档是一种类似 JSON 的结构。(BSON)
2、三个概念
- 数据库(database)
数据库是一个仓库,在仓库中可以存放集合- 集合(collection)
集合类似数组,在集合中可以存放文档- 文档(document)
文档数据库中最小的单位,我们存储和操作的内容都是文档
3、下载
4、安装
安装包默认安装
配置环境变量
在C盘创建文件夹 data;在 data 中创建文件夹 db;
打开 cmd 命令行窗口,输入
mongod
启动 mongdb 服务器(如果是 32位 系统,则输入
mongod --storageEngine=mmapvl) 在其它数据库启动并且自定义端口:
mongod --dbpath 数据库路径 --port 端口号(最大不要超过 65535)`(MongoDB6.0 以后做出了重大改变,MongoDB 已经不再默认安装 shell 工具)
- 下载 MongDB Shell :
https://www.mongodb.com/try/download/shell- 配置环境变量
再打开一个 cmd 窗口,输入
mongosh
,出现test>
(针对 MongoDB 6.0)以前的版本)将 MongoDB 设置为系统服务,可以自动在后台启动
在 data 下创建 db 和 log 文件夹
在 bin 所在目录下添加一个配置文件:mongod.cfg
以管理员的身份打开命令行窗口,执行命令:
sc.exe create MongoDB binPath= "\"C:\Program Files\{``{ mongod 的 目录 }}\bin\mongod.exe\" --service --config=\"C:\Program Files\{``{ mongod 的 目录 }}\mongod.cfg\"" DisplayName="MongoDB" start= "auto"
启动 mongodb service
如果启动失败,则在控制台输入
sc delete MongoDB
删除之前配置的服务,再重新开始配置
三、基本操作
1、基本概念
- 数据库(database)
- 集合(collection)
- 文档(document)
在 MongoDB 中,数据库和集合都不需要手动创建。当创建文档时,如果文档所有的集合或数据库不存在会自动创建数据库和集合。
MongoDB 的文档的属性值也是一个文档,当一个文档的属性值是一个文件时,我们将这个文档叫做内嵌文档;
MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档可以通过 . 的形式来匹配,此时属性名必须使用引号。
2、基本指令
show dbs
、show databases
:显示当前的所有数据库use 数据库名
:进入到指定的数据库中db
:表示的是当前所处的数据库show collections
:显示数据库中所有的集合
3、数据库的 CRUD(增删改查) 的操作
db.<collection>.insert(doc)
:向集合中插入一个或多个文档
- 当向集合中插入文档时,如果没有指定 _id 属性,则数据库会自动为文档添加 _id。该属性作为文档的唯一标识
db.collection.insertOne()
:插入一个文档对象dn.collection.insertMany()
:插入多个文档对象(参数必须是数组)
db.<collection>.find()
:查询当前集合中所有的文档,find() 可以接受一个对象作为条件参数
{}
表示查询集合中所有文档{属性: 值}
查询属性是指定值的文档- find() 返回的是一个数组
db.<collection>.findOne()
:用来查询集合中符合条件的第一个文档
- findOne() 返回的是一个对象
db.<collection>.find({}).count()
:查询所有结果的数量
db.<collection>.find().limit(n)
:设置显示数据的上限
db.<collection>.find().skip(n)
:跳过指定数量的数据
db.<collection>.find().skip((页码 - 1) * 每页显示的条数).limit(每页显示的条数)
- MongoDB 会自动调整 skip 和 limit 的位置
db.<collection>.updateOne(查询条件, 新对象)
:修改
- update() 默认情况下会使用新对象来替换旧的对象,如果要修改指定的属性,而不是替换则要使用"修改操作符":
$set
:可以用来修改文档中的指定属性$unset
:可以用来删除文档的指定属性$push
:用于向数组中添加一个新的元素$addToSet
:向数组中添加一个新元素,如果数组中已经存在该元素,则不会添加- 默认只会修改一个文档
db.<collection>.updateMany()
:同时修改多个符合条件的文档
db.<collection>.replaceOne()
:替换一个符合条件的文档
db.<collection>.remove()
- remove() 可以根据条件删除文档,传递的条件方式与 find() 类似,删除所有符合条件的文档(默认情况下)。如果 remove() 第二个参数传递一个 true,则只会删除一个
- 如果只传递一个空对象作为参数,则会删除集合中的所有文档(性能较差)
db.<collection>.deleteOne()
db.<collection>.deleteMany()
db.<collection>.drop()
:删除集合
4、sort
查询文档时,默认情况时按照 _id 的值进行排列的(升序)
sort() 可以用来指定文档的排序的规则,sort() 需要传递一个对象来指定排序规则:1 -> 升序 // -1 -> 降序
limit、skip、sort 可以任意排序
5、投影
在查询时,可以在第二个参数位置来设置查询结果
四、文档间的关系
1、single to single
在 MongoDB 中可以通过内嵌文档的形式来体现出 single to single 的关系
2、one-to-many / many-to-one
同样可以通过内嵌文档来映射一对多的关系
3、many-to-many
利用各个集合之间的 _id 建立联系
五、Mongoose
1、简介
- Mongoose 是一个可以通过 Node 操作 MongoDB 的模块
- Mongoose 是一个对象文档模型(ODM)库
2、好处
- 可以为文档创建一个模式结构(Schema)
- 可以对模型中的对象/文档进行验证
- 数据可以通过类型转换转换为对象模型
- 可以使用中间件来应用业务逻辑挂钩
- 比 Node 原生的 MongoDB 驱动更容易
3、新的对象
- Schema(模式对象)
定义约束了数据库中的文档结构- Model
Model 对象作为集合中的所有文档的表示,相当于 MongoDB 数据库中的集合 collection- Document
表示集合中的具体文档,相当于集合中的一个具体文档
4、使用 Mongoose
- 下载安装 Mongoose
npm i mongoose --save
- 在项目中引入 mongoose
const mongoose = require("mongoose");
- 连接 MongoDB 数据库
mongoose.connect('mongodb://数据库的ip地址:端口号/数据库名');
如果端口号时默认端口号(27017)则可以省略- 监听 MongoDB 数据库的连接状态
通过监视 mongoose.connection 可以监听数据库的连接与断开
mongoose.connection.once("open/close", function() {})
- 断开连接(一般不使用)
mongoose.disconnect()
5、Schema 和 Model
创建 Schema 对象
jsconst Schema = mongoose.Schema; const stuSchema = new Schema({ name: String, age: Number, gender: { type: String, default: "female" }, address: String });
通过 Schema 创建 Model
jsconst StuModel = mongoose.model("student", stuSchema); StuModel.create({ name: "白骨精", age: 16, gender: "female", address: "白骨洞" }).then(() => { console.log("插入成功!"); })
6、Model 的方法
Model.create(doc(s))
:用来创建一个文档并添加到数据库中
- doc(s):可以是一个文档对象,也可以是一个文档对象的数组
Model.find(conditions, [projection], [options]);
:查询所有条件的文档,返回一个数组
Model.findById(id, [projection], [options]);
:根据文档的 id 属性查询文档
Model.findOne([conditions], [projection], [options]);
:查询符合条件的第一个文档
- conditions:查询的条件
- projection 投影 需要获取到的字段
{name: 1, _id: 0}
"name -_id"
- options:查询选项(skip、limit...)
Model.update(conditions, doc, [options]);
Model.updateMany(conditions, doc, [options]);
Model.updateOne(conditions, doc, [options]);
Model.replaceOne(conditions, doc, [options]);
Model.deleteOne(conditions);
Model.deleteMany(conditions);
Model.count(conditions);
:统计文档的数量
7、document 的方法
Model#save([options])
document.updateOne(update, [options])
:修改对象document.deleteOne()
:删除对象document.get(name)
:获取文档中的指定属性值document.set()
:设置文档的指定属性值document.id
:获取文档的 _id 属性值document.toJSON()
:转换为一个 JSON 对象document.toObject()
:把 document 对象转换成一个 普通的 JSON 对象