04_数据库

1 Web架构

web总共分为三个部分:

  • 客户端
  • 服务器
  • 数据库

web网站访问过程:

  • 客户端向服务器发送请求
  • 服务器操作数据库
  • 数据库将结果返回给服务器
  • 服务器将结果响应给客户端

2 数据库概念

数据库(Database)

  • 数据库是按照数据结构来组织、存储和管理数据的仓库
  • 程序在内存中运行,一旦程序运行结束或者计算机断电,程序运行中的数据都会丢失
  • 因此我们需要将一些程序运行的数据保存到硬盘当中,而数据库就是数据持久化的最佳选择
  • 简而言之,数据库就是存储数据的仓库

数据库分类

数据库主要分为两种:

  • 关系型数据库(RDBMS)
    • MySQL、Oracle、DB2、SQL Server
    • 关系数据库中都是数据表
  • 非关系型数据库(NoSQL - Not Only SQL)
    • SQL结构化查询语言
      • 所有关系型数据库都是使用SQL操作
      • 标准化语言,是一门语言
      • 比如W3C规范,是一种标准,由各个厂商实现
      • 每个厂商实现方式不完全一样
      • 标准化虽然可以带来开发和学习成本的简化,但是同时限制了创新的机会
    • MongoDB、Redis
    • 文档数据库MongoDB
    • 键值对数据库

3 MongoDB 简介

  • MongoDB是为快速开发互联网Web应用设计的数据库系统
  • MongoDB设计目标是极简、灵活、作为Web应用栈的一部分
  • MongoDB的数据模型是面向文档的,文档是一种类似于JSON的结构
  • 简单来说就是MongoDB数据库存储的是各种各样的JSON
  • 增强版的JSON,叫做BSON,可以存储二进制数据,可以认为就是JSON

4 安装MongoDB

下载安装

下载地址:https://www.mongodb.com/try/download/community

  • 偶数版为稳定版,奇数版为开发版
  • 对32位系统支持不好,不建议使用32位系统安装
  • 从官网下载MongoDB数据库安装包至本地,双击该安装包,根据安装提示一步一步操作,完成数据库的安装。

配置环境变量

  • 我的电脑 -> 右键属性 -> 高级系统设置 -> 环境变量 -> 系统环境变量 -> 找到 Path
  • 双击Path -> 在弹窗内添加mongodb安装目录D:\Project\MongoDB\Server\5.0\bin-> 点击所有确定保存
  • win + R 键打开控制台 -> 输入 mongod -> 没有出现不是内部或外部命令说明可以使用了

5 开启MongoDB服务

  • 在命令行工具中运行命令mongo,连接 mongodb,出现 > 说明启动成功
  • 默认监听 27017 端口
  • 默认端口不要修改,需要修改的话,最大不能超过 65535

数据库(database)

  • 数据库服务器
    • 服务器用来保存数据
    • 最新版本默认已启动
  • 数据库客户端
    • 客户端用来操作服务器,对数据进行增删改查的操作

6 基本概念

数据库服务器里面可以有多个数据库。

  • 数据库(database)
    • 数据库是一个仓库,在仓库中可以存放多个集合
  • 集合(collection)
    • 集合类似于数组,在集合中可以存放多个文档
  • 文档(document)
    • 数据库中的最小单位,存储和操作的内容都是文档
  • 字段
    • 文档中的一条数据,属性名就是字段名
  • 数据库和集合都不需要手动创建
    • 当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建

7 安装可视化工具

下载地址:https://www.mongodbmanager.com/download-mongodb-manager-free

8 基本操作

常用命令

  • 显示数据库
    • show dbsshow databases
  • 进入数据库
    • use test
  • 操作数据库
    • db 代表当前数据库
  • 显示数据集合
    • show collections

CRUD (增删改查) 操作

  • 数据库中插入一个或多个文档
    • db.<集合名>.insert(doc)
    • db.<集合名>.insertOne(doc) 插入一个文档
    • db.<集合名>.insertMany(doc) 插入多个文档
    • 下面两个方法更像是第一个方法的拆分,但是下面两个语义更加清晰
    • 插入文档时,如果没有给文档指定 _id 属性,则数据库会自动为文档添加 _id,可以自己指定 _id
    • 该属性为文档的唯一标识,不可重复,根据时间戳+机器码生成 ObjectId(),确保数据唯一
// 向 test 数据库中 person 集合插入一个新数据 {name:"张三",age:"18"}
db.person.insert({name:"张三", age:"18"});
// 多条数据
db.person.insert([{name:"张三", age:"18"},{name:"李四", age:"18"},{name:"赵五", age:"18"}
]);
  • 查询集合中所有符合条件的文档
    • db.<集合名>.find({}) 可以接受一个对象作为条件参数
    • {属性名1:值,属性名2:值} 查询属性是指定值的文档
    • db.<集合名>.findOne({}) 用来查询集合中符合条件的第一个文档
    • db.<集合名>.find({}).count() 查询所有结果的数量
  • 修改集合中符合条件的文档
    • db.<集合名>.update({查询条件},{新对象},{配置}) 默认只修改一个
    • db.<集合名>.updateOne({查询条件},{新对象}) 修改一个符合条件的文档
    • db.<集合名>.updateMany({查询条件},{新对象}) 同时修改多个符合条件的文档
    • db.<集合名>.replaceOne({查询条件},{新对象}) 替换一个符合条件的文档
    • 默认使用新对象替换旧对象
    • 如果需要修改指定的属性,而不是替换,需要使用“修改操作符”来完成修改
    • $set 可以修改文档中的指定属性
    • $unset 可以用来删除文档的指定属性
db.person.update({name:"张三"},{$set: {sex: "男",address: "幸福村"}
});// 修改多个
db.person.update({name:"张三"},{$set: {sex: "男",address: "幸福村"}},{multi: true}
);db.person.update({name:"张三"},{$unset: {address: "111"}
});
  • 删除集合中符合条件的文档
    • db.<集合名>.remove({条件})
      • 删除符合条件的所有文档,第二个参数为 true 只删除一个
      • 条件必须设置,如果没有直接删除所有文档
    • db.<集合名>.deleteOne({条件}) 删除符合条件的一个文档
    • db.<集合名>.deleteMany({条件}) 删除符合条件的多个文档
    • db.<集合名>.drop() 删除集合
    • db.dropDatabase() 删除数据库
  • 数据库中数据一般不会真正的删除,所以删除的方法很少调用
    • 一般都是单独添加一个字段,表示数据是否删除
    • 这种删除只是程序上的删除,不是物理删除
    • 不建议使用物理删除,因为删除之后无法找回
  • 文档的属性值可以是一个文档,当一个文档的属性值是一个文档时,我们称这个文档叫做内嵌文档

其他方法

  • skip((页码-1)*每页显示条数).limit(显示条数)
  • limit() 用于设置显示数据的上限
  • skip() 用于跳过指定数量的数据
  • sort() 需要传递一个对象指定排序规则,1 为升序,-1 为降序
    • db.user.find({}).sort({_id:1,name:-1})
    • db.user.find({},{name:1,_id:0})
  • $gt 大于
  • $gte 大于等于
  • $lt 小于
  • $lte 小于等于

9 练习作业

  • 进入 user_manage 数据库
  • 向数据库中的 users 集合中插入文档
  • 文档的内容包含用户名、密码、年龄、爱好、邮箱、是否删除

10 文档关系

  • 一对一(one to one)
    • 夫妻(一个丈夫对应一个妻子)
    • 可以使用内嵌文档的方式体现
  • 一对多(one to many)/ 多对一(many to one)
    • 用户 - 银行卡
    • 用户 - 订单
    • 可以通过内嵌文档的方式体现
    • 通过单个字段实现关联
  • 多对多(many to many)
    • 分类 - 商品
    • 老师 - 学生
    • 添加字段值为数组

11 插件操作数据库

  • 大部分使用程序来完成数据库操作
  • Mongoose 让我们可以通过 Node 操作 MongoDB 模板
  • Mongoose 是对象文档模型(ODM)库,对原生的模块进行了封装,提供了更多的功能

Mongoose 优势

官方地址:http://www.mongoosejs.net/

  • 可以为文档创建一个模式结构(Schema)
  • 可以对模型中的对象/文档进行验证
  • 数据可以通过类型转换转换为对象
  • 可以使用中间件来应用业务逻辑挂钩
  • 比 Node 原生的 MongoDB 驱动更容易

使用 Mongoose

  • 使用 npm install mongoose命令下载
  • 使用 const mongoose = require('mongoose'); 引入 mongoose
  • 使用 mongoose.connect('mongodb://localhost/user_manage');
    • 如果使用默认端口号(27017),可以省略不写
  • 监听 MongoDB 数据库的连接状态
    • mongoose 对象中有一个 connection 属性,表示数据库连接
    • 通过监视该对象,可以来监听数据库的连接与断开
    • mongoose.connection.once('open',function(){}) 数据库连接成功事件
    • mongoose.connection.once('close',function(){}) 数据库连接断开事件
  • 使用 mongoose.disconnect() 断开数据库连接(一般不使用)
    • 一般只需要连接一次,连接一次以后,除非停止服务器,否则连接不会断开

Mongoose 对象

  • Schema(模式对象)
    • 定义约束了数据库中的文档结构
  • Model
    • Model 对象作为集合中的所有文档表示
    • 相当于 MongoDB数据库中的集合collection
  • Document
    • 表示集合中的具体文档

Schema 对象

const Schema = mongoose.Schema;
// 创建 Schema(模式)对象
let stuSchema = new Schema({name: String,age: Number,sex: {type: String,default: '男'},address: String
});
// 通过 Schema 来创建 Model
// Model 代表的是数据库中的集合,通过 Model 才能对数据库进行操作
// mongoose.model(modelName, Schema);
// modelName 是要映射的集合名
// mongoose 会自动将集合名变成复数
let StuModel = mongoose.model('student', stuSchema);// 向数据库中插入一个文档
// StuModel.create(doc, function(err){});
StuModel.create({name: '孙悟空',age: 18,sex: '男',address: '花果山'
}, function(err){if(!err){console.log('插入成功');}
});

Model 方法

  • Model.create(doc(s), [callback]) 创建一个或多个文档并添加到数据库中
    • doc(s) 可以是一个文档对象,也可以是一个对象数组
    • callback 操作完成以后调用的回调函数
StuModel.create({name: '孙悟空',age: 18,sex: '男',address: '花果山'
}, function(err){if(!err){console.log('插入成功');}
});
  • Model.find(conditions, [projection], [options], [callback]) 查询所有符合条件的文档
  • Model.findById(id, [projection], [options], [callback]) 根据文档id属性查询文档
  • Model.findOne([conditions], [projection], [options], [callback]) 查询符合条件的第一个文档
    • conditions 查询条件
    • projection 投影 需要获取的字段
      • 两种方式
      • {name: 1, _id: 0}
      • "name age -_id"
    • options 查询选项(skip limit
    • callback 回调函数。查询结果结果会通过回调函数返回,参数必选,不传没有返回值
      • 通过 find() 查询的结果,返回的对象就是 Document,文档对象
      • Document 对象是 Model 的实例
      • doc instanceof StuModel
StuModel.find({ name: '孙悟空' }, { name: 1, _id: 0 }, { skip: 2, limint: 10 }, function (err, docs) {if (!err) {console.log(docs);}
});
  • Model.update(conditions, doc, [options], [callback])
  • Model.updateMany(conditions, doc, [options], [callback])
  • Model.updateOne(conditions, doc, [options], [callback])
    • 修改一个或多个文档
    • conditions 查询条件
    • doc 修改后的对象
    • options 配置参数
    • callback 回调函数
  • Model.replaceOne(conditions, doc, [options], [callback])
StuModel.updateOne({ name: '张三' }, { $set: { age: 20 } }, function (err) {if (!err) {console.log('修改成功');}
});
  • Model.remove(conditions, [callback])
  • Model.deleteOne(conditions, [callback])
  • Model.deleteMany(conditions, [callback])
    • 删除一个或多个文档
    • conditions 查询条件
    • callback 回调函数
StuModel.remove({ name: '张三' }, function (err) {if (!err) {console.log('删除成功');}
});
  • Model.count(conditions, [callback])
    • 统计文档的数量
Model.count({ name: '张三' }, function (err, count) {if (!err) {console.log(count);}
});

Document 对象

  • Document 和集合中的文档一一对应,Document 是 Model 的实例
  • 通过 Model 查询到的结果都是 Document
  • Model#save([options], [fn]) 保存文档对象
// 创建一个Document
let stu = new StuModel({name: '孙悟空',age: 18,sex: '男',address: '花果山'
});// Document 方法
stu.save(function(err){if(!err){console.log('插入成功');}
});StuModel.findOne({}, function (err, doc) {if (!err) {console.log(doc);// 修改方式1doc.update({$set:{age:20}},function(err){if(!err){console.log('修改成功');}})// 修改方式2doc.age = 20;doc.save();// 删除doc.remove(function(err){if(!err){console.log('删除成功');}});// 获取属性值console.log(doc.get('age'));console.log(doc.age);// 设置属性值doc.set('name', '张小三');doc.name = '张小三';// 获取 _id 值doc._id}
});

模块化连接

  • 定义一个模块连接数据库
// tools/conn_mongo.js
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/user_manage');
mongoose.connection.once('open', function () {console.log('数据库连接成功');
})// index.js
require('./tools/conn_mongo');
  • 定义一个模块,操作 Student 模型
// models/student.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const stuSchema = new Schema({name: String,age: Number,sex: {type: String,default: '男'},address: String
});
// 定义模型
const StuModel = mongoose.model('student', stuSchema);
module.exports = StuModel;// index.js
let stu = require('./models/student');
stu.find({}, function(err, docs){if(!err){console.log(docs);}
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/96635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试/测试开发丨App自动化测试-弹窗异常处理

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27692 黑名单处理 运行过程中不定时弹框&#xff08;广告弹窗&#xff0c;升级提示框&#xff0c;新消息提示框等等&#xff09; 弹框不是 BUG&#xff0…

docker数据管理和网络通信

docker数据管理 管理 Docker 容器中数据主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&#xff09;。 1&#xff0e;数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机…

测试工程师思维学习

一、测试工程师应具备什么思维&#xff1f; 透过现象看本质&#xff0c;拒绝“一叶障目” 01、质疑和系统思维 02、创新思维 03、全局思维 04、风险驱动和组合思维 05、用户为中心和比较思维 06、BT思维和架构扩展性思维 二、测试工程师应避免的思维 01、同化现象 02、定位效…

数据结构-----二叉排序树

目录 前言 1.什么是二叉排序树 2.如何构建二叉排序树 3.二叉排序树的操作 3.1定义节点储存方式 3.2插入节点操作 3.2创建二叉排序树 3.4遍历输出&#xff08;中序遍历&#xff09; 3.5数据查找操作 3.6获取最大值和最小值 3.7删除节点操作 3.8销毁二叉排序树 4.完…

AdaBoost(上):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

Zookeeper经典应用场景实战(二)

文章目录 1、 Zookeeper 分布式锁实战1.1、 什么是分布式锁1.2、 基于数据库设计思路1.3、 基于Zookeeper设计思路一1.4、 基于Zookeeper设计思路二 1、 Zookeeper 分布式锁实战 1.1、 什么是分布式锁 在单体的应用开发场景中涉及并发同步的时候&#xff0c;大家往往采用Sync…

DRM全解析 —— CRTC详解(1)

本文参考以下博文&#xff1a; Linux内核4.14版本——drm框架分析(4)——crtc分析 特此致谢&#xff01; 1. 简介 CRTC实际上可以拆分为CRTC。CRT的中文意思是阴极摄像管&#xff0c;就是当初老电视上普遍使用的显像管&#xff08;老电视之所以都很厚&#xff0c;就是因为它…

【状态估计】将变压器和LSTM与卡尔曼滤波器结合到EM算法中进行状态估计(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

并发工具类库使用的常见问题

一、ThreadLocal在多线程环境中没有清理 由于ThreadLocal是和线程绑定的&#xff0c;如果线程被复用了&#xff0c;也即使用了线程池&#xff0c;那么ThreadLocal中的值是可能被复用的&#xff0c;这个特性如果是开发者没有预料到的&#xff0c;那么会产生很大的问题。例如&am…

人机言语交互模型的评估要素

智能客服中的言语交互模型评估要素&#xff0c;主要包括以下几个方面&#xff1a; 有效性&#xff1a;指模型能否准确识别和理解用户的言语意图&#xff0c;以及生成正确和合适的回答。可以通过比较模型生成的回答与人工回答的准确率来评估。流畅性&#xff1a;指模型在回答问…

【单调栈】下一个更大元素 II

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;单调栈循环数组 写在最后 Tag 【单调栈循环数组】【数组】 题目来源 503. 下一个更大元素 II 题目解读 在循环数组中找下一个更大的元素。循环数组指的是&#xff0c;数组的最后一个元素的下一个元素是数组首元素。 …

C语言之动态内存管理篇(1)

目录 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 今天收假了&#xff0c;抓紧时间写几篇博客。我又来赶进度了。今天我们来讲解动态内存管理。&#x1f197;&#x1f197; 为什么存在动态内存分配 假设我们去实现一个…

pip永久换源,虚拟环境

1 pip永久换源 2 虚拟环境 pip永久换源 # 自己写一个模块--->传到pypi上 # 安装第三方模块-清华&#xff0c;阿里云 pip install -i 源地址 模块名字# 永久换源 1、文件管理器文件路径地址栏敲&#xff1a;%APPDATA% 回车&#xff0c;快速进入 C:\Users\电脑用户\AppDat…

Excel插件:StatPlus Pro 7.7.0 Crack

Windows 版 StatPlus 借助 StatPlus&#xff0c;人们可以获得一套强大的统计工具和图形分析方法&#xff0c;可以通过简单直观的界面轻松访问。StatPlus 的可能应用范围几乎是无限的 - 社会学、金融分析、生物统计学、经济学、保险业、医疗保健和临床研究 - 仅举几个该程序已被…

SignalIR入门

SignalIR入门 简介教程1.创建项目2.添加 SignalR 客户端库3.创建 SignalR 中心4.配置 SignalR5.添加 SignalR 客户端代码 效果 简介 SignalR 是一个用于构建实时 Web 应用程序的开发工具和库&#xff0c;它可以让服务器端代码与客户端代码之间建立双向通信。SignalR 的中文解释…

05_模板引擎

模板引擎可以让将数据和HTML模板更加友好的结合&#xff0c;省去繁琐的字符串拼接&#xff0c;使代码更加易于维护。 1 EJS 文档地址&#xff1a;https://ejs.bootcss.com/#install 1.1 安装 npm install ejs 1.2 标签语法 <% ‘脚本’ 标签&#xff0c;用于流程控制&…

【思维构造】Circle of Monsters—CF1334C

Circle of Monsters—CF1334C 思路 每一个怪兽都有两种死法&#xff1a; 直接被子弹打死先被上一个怪兽爆炸击伤&#xff0c;剩下的血量再用子弹打死 所以&#xff0c;很容易看出来第二种死法对于所有的怪兽都是最优死法&#xff08;消耗子弹最少的死法&#xff09;。我们需要…

什么测试自动化测试?

什么测试自动化测试&#xff1f; 做测试好几年了&#xff0c;真正学习和实践自动化测试一年&#xff0c;自我感觉这一个年中收获许多。一直想动笔写一篇文章分享自动化测试实践中的一些经验。终于决定花点时间来做这件事儿。 首先理清自动化测试的概念&#xff0c;广义上来讲&a…

如何搭建一个 websocket

环境: NodeJssocket.io 4.7.2 安装依赖 yarn add socket.io创建服务器 引入文件 特别注意: 涉及到 colors 的代码&#xff0c;请采取 console.log() 打印 // 基础老三样 import http from "http"; import fs from "fs"; import { Server } from &quo…

pytorch 数据载入

在PyTorch中&#xff0c;数据载入是训练深度学习模型的重要一环。 本文将介绍三种常用的数据载入方式&#xff1a;Dataset、DataLoader、以及自定义的数据加载器。 使用 Dataset 载入数据 方法&#xff1a; from torch.utils.data import Datasetclass CustomDataset(Dataset…