Section-6 第一批用户入库
Lesson-1 NoSQL 简介
什么是 NoSQL
- 对不同于传统的关系型数据库的数据库管理系统的统称
关系型数据库,如mysql
NoSQL 数据库的分类
- 列存储(HBase)
- 文档存储(MongoDB)-- 例如存储json
- Key-value(Redis)
- 图存储(FlockDB)
- 对象存储(db4o)
- XML存储(BaseX)
为什么要用 NoSQL
- 简单(没有原子性、一致性、隔离性等复杂规范)
- 便于横向拓展
- 适合超大规模数据的存储
- 很灵活的存储复杂结构的数据(Schema Free)
Lesson-2 MongoDB 简介
什么是 MongoDB
- 来自于英文单词 "Humoongous",中文含义为庞大
- 面向文档存储的开源数据库
- 由 C++ 编写而成
为什么要用 MongoDB
- 性能好(内存计算)
- 大规模数据存储(可拓展性)
- 可靠安全(本地复制、自动故障转移)
- 方便存储复杂数据结构(Schema Free)
MongoDB 下载
- 官网下载
- 支持常见平台(Windows、Linux、OSX)
云 MongoDB
- 阿里云、腾讯云(收费)
- MongoDB 官方的 MongoDB Atlas(免费 + 收费)
Lesson-3 云数据库 -- MongoDB Atlas
操作步骤
- 注册用户
- 创建集群(虚拟服务器)
- 添加数据库用户
- 设置 IP 地址白名单
- 获取连接地址
自己账号密码备忘暗示(176@q - 167*.tt)
登录 mongodb官网 自行创建账号,创建集群,选择亚马逊的服务器跟新加波网点(速度会稍微快一点),第一个集群是免费的,后面如果还要增加集群是需要收费的,不过现在只是为了学习,这里步骤比较简单就不截图了
创建好的集群
由于新版的已经没有提示了,网上找到的文章都不是新版界面,自己摸索了一番,直接开始吧 - 选择connect连接,进入后就会要求创建第一个用户,第一个用户是相当于管理员拥有读写权限的。
- 选择连接的IP地址,第一个是本机,不过我有时候会在其他地方使用,所以选择第二个自定义,写入0.0.0.0任意IP都能连接
- 接下来选择连接方法,选择第二个Connect Your Application,也就是连接应用程序
- 最后一步默认即可,这样,后续需要使用的时候就可以直接点击连接,获取到连接地址了
- 如果需要修改用户,选择Database Access
- 如果需要修改IP地址,选择Network Access
到这里就完全ko了
而我实际是在电脑上安装的MongoDB,有点小曲折,网上文章也不是很实时,这里记录一下安装流程
下载MongoDB我尝试了各种方法都下不下来,老是下载报错,所以是直接网上下的3.4版本
安装的时候选择自定义文件夹,否则会默认安装到C盘上,反正个人不愿意
选择Custom自定义安装路径
一路Next即可,直到安装结束,我还在该文件夹下建立了一个 data\db 文件夹
安装完成后的文件夹目录
因为启动mongodb服务之前需要必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功
data\db
到这一步安装及创建目录工作完成,接下来是设置环境变量,我用的win8,直接搜高级系统设置
win8搜索
高级系统配置
点击环境变量
系统属性
双击path
系统属性
把刚才安装的文件夹目录复制到这里,千万不要跟其他文章说的一样加;号,如果要跟其他文章一样的界面需要点击编辑文本,一路确定回去,这样就可以在电脑的任何地方执行cmd命令都不会报mongod不是内部或外部命令了
添加环境变量
启动cmd,执行mongod --dbpath E:\data\db
,后面的路径就是我前面创建的 data\db 文件夹路径。为了后续能直接使用mongod.exe直接启动,这里需要将db放在E盘根目录下,而且必须为data/db。
访问http://localhost:27017/
安装Robo 3T 实现数据库可视化,这个太简单就不写步骤了
Lesson-4 使用 Mongoose 连接 MongoDB
操作步骤
- 安装 Mongoose
- 使用 Mongoose 链接 MongoDB
安装 Mongoose
执行 npm i mongoose -S
进行安装,需要先看一下 mongoose 官网 文档
Mongoose 链接 MongoDB
为了方便管理,这里在index.js文件目录下新建一个config.js目录,用于后续所有需要配置的东西
// config.js password 填密码,不要留 <> 号
module.exports = {
connectionStr: 在线 mongoDB 拿到的连接地址,
connectionLocal: 'mongodb://localhost:27017/database' // 连接本地mongoDB
}
连接远程 mongoDB,并监听错误
const mongoose = require('mongoose');
const { connectionStr, connectionLocal } = require('./config.js');
// 连接 mongoDB
// mongoose.connect(connectionStr, { useNewUrlParser: true } , () => console.log('MongoDB 连接成功'));
mongoose.connect(connectionLocal, { useNewUrlParser: true } , () => console.log('MongoDB 连接成功'));
// 打印错误信息
mongoose.connection.on('error', console.error);
接下来,我使用的都是本地MongoDB,因为单纯的不想连接远程,不好查看数据。我会使用本地 MongoDB + Robo 3T,上面我已经把本地跟远程的全都列出来了,任君挑选
Lesson-5 设计用户模块的 Schema
操作步骤
- 分析用户模块的属性
- 编写用户模块的 Schema
- 使用 Schema 生成用户 Model
我们在 app 文件夹下创建一个 models 文件夹,该文件夹用于定义用户模块的数据结构(Schema)及模型(Model)
Schema:相当于一个数据库的模板。Mongoose 中的所有内容都以 Schema 开头。每个模式都映射到 MongoDB 集合,并定义该集合中文档的数据结构(模板/模式)。
Model:基本文档数据的父类,通过集成 Schema 定义的基本方法和属性得到相关的内容。要使用我们的模式定义,需要将 Schema 转换为可以使用的模型。为此,我们将其传递给mongoose.model(modelName, schema)
|- models
|- user.js
// models/user.js
const mongoose = require('mongoose');
const { Schema, model } = mongoose;
const userSchema = new Schema({
name: { type: String, required: true },
age: { type: Number, default: 0 }
});
// user代表集合,导出的是一个类
module.exports = model('user', userSchema);
说不清,直接上图
Lesson-6 用 MongoDB 实现用户的增删改查
操作步骤
- 用 Mongoose 实现增删改查接口
- 用 Postman 测试增删改查接口
用 Mongoose 实现增删改查接口
前面已经在 models/users.js 中设置好了数据模型,并获取对应集合的数据导出,那么接下来只需要在控制器里使用即可。如果到这里不管文档啊,文章啊还是没法理解Schema,那就把它当做是一个格式校验吧,拿 VUE 的 props 去当参照吧,没在模型中的请求体一律被过滤没了,其实要说我真的理解它,我也还是不知道怎么理解这个词才是绝对正确的
- 重新说一下,运行
npm run start
,开启你的服务(你的服务是作为中间层,用来请求操作数据库的) - 开启 mongod.exe ,启动 mongoDB 服务
两者缺一不可,会把 3000 端口与 27017 端口占用,因此还需要注意端口的使用情况
// controller.js/users.js
const User = require('../models/users');
class UsersCtl {
async find (ctx) {
ctx.body = await User.find();
}
async findById (ctx) {
const user = await User.findById(ctx.params.id);
if(!user) ctx.throw(404, '用户不存在');
ctx.body = user;
}
async create (ctx) {
ctx.verifyParams({
name: { type: 'string', required: true }
});
// save方法,保存到数据库。并根据 RESTful API最佳实践,返回增加的内容
const user = await new User(ctx.request.body).save();
ctx.body = user;
}
async update (ctx) {
ctx.verifyParams({
name: {
type: 'string',
required: true
}
});
// findByIdAndUpdate,第一个参数为要修改的数据id,第二个参数为修改的内容
const user = await User.findByIdAndUpdate(ctx.params.id, ctx.request.body);
if(!user) ctx.throw(404, '用户不存在');
ctx.body = user;
}
async delete (ctx) {
const user = await User.findByIdAndRemove(ctx.params.id);
if(!user) ctx.throw(404, '用户不存在');
ctx.status = 204; // 没有内容,但是成功了
}
}
module.exports = new UsersCtl();
这里我就不放所有验证截图的,自行操作一下即可。有一点需要说明的,看下面的截图,返回的是原数据,如果想返回的是修改后的数据,那么该方法实际有第三个参数 options,第四个参数 callBack(回调函数,这里就不写了),具体可以查看文档 mongoosejs 文档
官方文档截图 修改特定用户options 可选参数:
new: Boolean- 默认为false。返回修改后的数据。
upsert: Boolean- 默认为false。如果不存在则创建记录。
runValidators: 如果值为true,执行Validation验证。
setDefaultsOnInsert: 如果upsert选项为true,在新建时插入文档定义的默认值。
sort: 如果有多个查询条件,按顺序进行查询更新。
select: 设置数据的返回。