MongoDB数据库

  • 数据库及坏境搭建
    • 使用数据库原因
    • 什么是数据库
    • 数据库相关概念
  • 开启mongodb
    • 数据库连接
  • MongoDB增删改查操作
  • 模板引擎
    • 模板引擎基础概念
    • 模板引擎基础概念
  • 案例之学生档案管理
    • 制作流程
  • 总结


数据库及坏境搭建

使用数据库原因

  • 动态网站中的数据都是存储在数据库中
  • 数据库可以持久存储客户端通过表单收集的用户信息;
  • 数据库软件本身就可以对数据高效管理;

什么是数据库

存储数据的仓库,将数据有序分门别类的存储,通过API操作
常见数据库软件又:mysql mongoDB oracle

MongoDB数据库下载安装
MongoDB菜鸟教程
MongoDB官方学习网站
安装MongoDB Compass可视化软件

数据库相关概念


集合就是类别的意思,集合中又可以有多个文档,在这个文档里面又又很多属性;
Mongoose第三方包

开启mongodb

因为权限问题需要以管理员身份运行powershell

数据库连接

使用mongoose提供的connect方法即可连接数据库;
84
对使用mongoose使用时遇到的问题

解决方法:

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/playground', {
        useNewUrlParser: true,
        useUnifiedTopology: true
    })
    .then(() => { console.log('数据库连接成功') })
    .catch(err => console.log('数据库连接失败'))
  1. 创建数据库,在MongoDB中不需要显示创建数据库,如果正在使用的数据库不存在,MongoDB会自动创建;

MongoDB增删改查操作

1. 创建集合
如何创建集合呢?插入的文档一定要属于一个类别;
创建集合分为两步:一是对集合设定规则,而是创建集合,创建mongoose.Schema构造函数的实例即可创建集合;
前面讲了集合就相当于JavaScript里面的数组;创建集合并应用规则;
创建Schema构造函数的实例对象
创建集合规则

const courseSchema = new mongoose.Schema({
    name: String,
    author: String,
    isPublished: Boolean
});

使用规则创建集合,下面代码中的Course就是集合的构造函数

const Course = mongoose.model('Course', courseSchema) //courses

2. 创建文档

连接数据库应该在compass中看到数据,所以需要向集合中插入数据即创建文档分为两步:

  • 创建集合实例
  • 调用实例对象下的save方法将数据保存到数据库中
    代码示例,下列代码执行完之后刷新一下compass便可以在compass中看到数据库playground(自己定义的)
//Course是集合的构造函数
const course = new Course({
    name: 'node.js基础',
    author: '黑马',
    isPublished: true
});
course.save();//将文档插入到数据库中

数据库界面

第二种创建文档的方式
利用Course构造函数下面的方法create,creat里面有回调函数证明是异步API,实际上在数据库操作中都是异步API;

Course.create({ name: 'JavaScript', author: '黑马2', isPublished: false }, (err, result) => {
    console.log(err);
    console.log(result);
})

上面代码还可以写为另外一种形式,使用promise的方法 then catch不适用回调函数
上面代码结果

3. mongoDB数据库导入数据
首先需要在MongoDB安装目录找到安装路径bin文件里面但是在我的bin目录下没有mongoimport.exe这个文件,所以呢,参考文档
mongoimport -d 数据库名称 -c 集合名称 --file 要导入的数据文件
这要去powerShell下执行,我在VSCode提供的终端调试工具下执行任然会报错

在compass中可以看到新增加的数据user

4. 查询文档
find里面没有参数则查询用户集合中的所有文档
代码示例

User.find().then(result => console.log(result));

find可以根据id值去查找:
代码示例

User.find({ _id: '5c09f267aeb04b22f8460968' }).then(result => console.log(result))

上面代码执行结果

通过find查询的文档返回都是以数组形式;
findOne默认返回一条数据
代码示例

User.findOne().then(result => console.log(result))
//User.findOne({ name: '李四' }).then(result => console.log(result))

上面代码执行结果

查询条件是一个范围的时候$gt:20表示>20 $lt:40表示<40

User.find({ age: { $gt: 20, $lt: 40 } }).then(result => console.log(result))

查询到的结果

查询条件是包含的时候:$in

User.find({ hobbies: { $in: ['足球'] } }).then(result => console.log(result))

查询到的结果

选择查询的字段

User.find().select('name email -_id').then(result => console.log(result))

其中-_id表示不想查询id
查询到的结果

将数据按照年龄排序
按照年龄升序排序

User.find().sort('age').then(result => console.log(result))

按照年龄降序排序

User.find().sort('-age').then(result => console.log(result))

90 11:50
跳过一些数据
skip跳过 limit限制数量

User.find().skip(2).limit(2).then(result => console.log(result))

删除文档
删除_id5c09f267aeb04b22f8460968的数据,下面语句返回删除的文档,会删除第一个文档;

User.findOneAndDelete({ _id: '5c09f267aeb04b22f8460968' }).then(result => console.log(result))

删除多个文档

User.deleteMany({}).then(result => console.log(result));

返回的值是对象
更新文档
name为李四的数据更新为李狗蛋

User.updateOne({ name: '李四' }, { name: '李狗蛋' }).then(result => console.log(result))

更新多个数据

User.updateMany({}, { age: 56 }).then(result => console.log(result))

6. mongoose验证
在创建集合规则时,可以设置当前字段的验证规则,验证失败就输入插入失败

const postSchema = new mongoose.Schema({
    title: {
        type: String,
        // required: true //表示title为必须输入的信息
        required: [true, '请输入文章标题'],
        minlength: 2,
        maxlength:[5,'文章标题长度不能超过5'],
        trim: true //去除空格 中间的空格不可去掉
    }
});

required:true表示必须输入的信息否则会报错
minlength:2表示title最小长度为2
maxlength:5表示title最大长度为5

category: {
        type: String,
        //指定当前字段可选的值,其他值不行
        enum: ['html', 'css', 'node.js', 'javascript']
    }

enum那句话表示category只能从[]中选取

author信息验证

author: {
        type: String,
        validate: {
            validator: (v) => {
                //返回布尔值 true则验证成功 v是要验证的值
                return v && v.length > 4
            },
            //自定义错误 提示信息
            message: '传入的值不符合验证规则'
        }
    }

想要拿到error报错信息 在控制台显示
代码示例

.catch(error => {
        //获取错误信息对象
        const err = error.errors;
        //循坏错误信息对象
        for (var attr in err) {
            //将错误信息打印到控制台中
            console.log(err[attr]['message']);
        }
    })

7. 集合关联
不同集合的数据之间是有关系的,例如文章信息和用户信息存储在不同集合中,但文章是某个用户发表的,要查询文章的所有信息包括发表用户,需要用到关联;
集合关联

  • 用id对集合关联
  • 使用populate方法进行关联集合查询
    代码示例如下
    //用户集合规则
const userSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    }
});
//文章集合规则
const postSchema = new mongoose.Schema({
    title: {
        type: String
    },
    author: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    }
});
//用户集合
const User = mongoose.model('User', userSchema);
//文章集合
const Post = mongoose.model('Post', postSchema);
//创建用户
// User.create({ name: 'itheima' }).then(result => console.log(result))
// Post.create({ title: '123', author: '5feb1a694edbf9365cb96aa5' }).then(result => console.log(result))
Post.find().populate('author').then(result => console.log(result))

图解说明

集合关联查询结果

案例:用户信息增删改查
619已完结

模板引擎

模板引擎基础概念

  1. 概念: 模板引擎是第三方模块,让开发者更加友好的方式拼接字符串即模板引擎的功能就是用来拼接字符串。
  2. art-template模板引擎
    使用npm install art-template下载,
    引入模板引擎:const template=require('art-template')引入模板引擎;
    使用: const html=template(‘模板路径’,数据);
    html.art文件代码示例
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	{{name}}
    {{age}}
</body>
</html>

app.js文件代码示例>

//导入模板引擎
const template = require('art-template');
const path = require('path');
//1.模板路径 绝对路径 所以要用到字符串拼接
const views = path.join(__dirname, 'views', 'index.art');
//2.要在模板中显示的数据 对象类型 返回值是拼接好的字符串
const html = template(views, {
    name: '张三',
    age: 20
});
console.log(html);

终端执行结果

模板引擎基础概念

1. 模板语法
art-template支持两种模板语法:标准语法原始语法
标准语法可以让模板更容易读写,原始语法具有强大的逻辑处理能力。
标准语法:{{数据}}
原始语法 :<%=数据%>
2.输出
可以具有计算功能
art代码示例

<body>
<!----标准语法--->
<p>{{name}}</p>
<p>{{1+1}}</p>
<p>{{1+1==2?'相等':'不相等'}}</p>

<!----原始语法--->
<p><%= name %></p>
<p><%= 1+1 %></p>
<p><%= 1+1==2?'相等':'不相等' %></p>
<body>

终端执行结果

3. 原文输出

代码执行结果

4. 条件判断
在模板中根据条件决定显示哪块HTML代码

标准语法代码示例age=20

{{if age >18}}
年龄大于18
{{else if age <15}}
年龄小于15
{{else}}
年龄不符合要求
{{/if}}


原始语法代码示例age=20,在条件那里可以写所有原生js代码

<% if (age>18) { %> 
年龄大于18 
<%} else if(age<15) { %>
年龄小于15
<% } else{ %>
年龄不符合要求
<% } %>


5. 循坏

如何让.art文件在vscode中识别为.html文件

循坏案例标准语法

const html = template(views, {
    users: [{
        name: '张三',
        age: 20,
        sex: '男'
    }, {
        name: '李四',
        age: 30,
        sex: '男'
    }, {
        name: '玛丽',
        age: 15,
        sex: '女'
    }]
});
<ul>
    {{each users}}
    <li>
        <!-- 第一次循坏就是第一个对象 第二次循坏就是第二个对象-->
        {{$value.name}} {{$value.age}} {{$value.sex}}

    </li>
    {{/each}}
</ul>


循坏案例原始语法

<ul>
    <% for(var i=0;i<users.length;i++) {%>
        <li>
            <%= users[i].name%>
                <%= users[i].age%>
                    <%= users[i].sex%>
        </li>
        <% } %>
</ul>


6.字模板
字模板将网站公共(头部 底部)区块抽离到单独的文件中

标准语法包含headd.art footer.art两个子模板

上述代码执行结果

原始语法

{{include './common/headd.art'}}
<% include('./common/headd.art') %>
    <div>
        {{msg}}
    </div>
    {{include './common/footer.art'}}
    <% include('./common/footer.art') %>


7.模板继承
可以将HTML估计抽离到单独的文件中,其他页面模板可以继承骨架文件;


继承代码示例


8. 模板配置

  • 向模板中导入变量template.defaults.inports.变量名=变量值
    如:时间格式化
    首先找到时间格式化模块 下载
    未加处理的原始时间格式

    导入模板变量
template.defaults.imports.dateFormat = dateFormat;

使用模板变量

{{ dateFormat(time,'yyyy-mm-dd')}}

格式化以后的时间格式:

  • 设置模板根目录 template.defaults.root=模板目录
  • 设置模板默认后缀.art 可以省略掉上面的.art
template.defaults.extname = '.art';

案例之学生档案管理

完整代码模板引擎案例

  1. 模板引擎案例之学生档案管理
    目标:模板引擎应用,node.js项目制作流程

制作流程

  1. 建立项目文件夹并生成项目描述文件 在控制台输入npm init -y
  2. 创建网站服务器实现客户端和服务器端通信
  3. 连接数据库并根据需求设计学员信息表
  4. 创建路由并实现页面模板呈递
  5. 实现静态资源访问
  6. 实现学生信息添加功能
  7. 实现学生信息展示功能
    怎么查看端口占用情况

具体实现步骤:1.首先引入http模块 建立服务器
2. 然后实现数据库连接 连接之前要先下载再引入
3. 数据库连接之后 建立集合规则,然后利用这个规则创建集合信息 在进行导入到app.js文件当作
4.创建路由 利用第三方模块router 下载npm install router

路由的使用

以下代码相当于以前的if语句

router.get('/add', (req, res) => {
    res.end('add');
});

第三方模块serve-static实现静态资源访问服务

  • 引入模块
  • 调用方法创建静态资源服务
  • 启用静态资源服务功能

    添加学生信息功能步骤分析
  • 在模板的表单中指定请求地址与请求方式
  • 为每一个表单添加name属性
  • 添加实现学生信息功能路由
  • 接收端传递过来的学生信息
  • 将学生信息添加到数据库中
  • 将页面重定向到学生信息列表页面

学生信息列表页面分析

  1. 从数据库中将所有学生信息查询出来
  2. 通过模板引擎将学生信息和HTML模板进行拼接
  3. 将拼接好的HTML模板响应给客户端

总结

更多推荐

前端后端交互之MongoDB数据库+模板引擎