🖥️ NodeJS专栏:Node.js从入门到精通
🖥️ 博主的前端之路(源创征文一等奖作品):前端之行,任重道远(来自大三学长的万字自述)
🖥️ TypeScript知识总结:TypeScript 学习笔记(十万字超详细知识点总结)
🧑💼 个人简介:大三学生,一个不甘平庸的平凡人🍬
👉 你的一键三连是我更新的最大动力❤️!
📑目录
- 🔽 前言
- 1️⃣ 数据库类型
- 🔹 关系型数据库
- 🔹 非关系型数据库
- 🔹 区别
- 🔹 为什么选择MongoDB?
- 2️⃣ 在命令行中操作数据库
- 🔹 数据库操作
- 🔹 集合操作
- 🔹 文档操作
- 3️⃣ Nodejs连接操作数据库
- 🔹 创建模型
- 🔹 数据操作
- 🔼 结语
🔽 前言
既然我们学习了NodeJS
,正式进入了后端开发的领域,那么数据库的知识就必不可少了,这篇文章我们将去学习如何在NodeJS
中应用非关系型数据库MongoDB
,后期也会学习如何应用关系型数据库MySql
。
由于本专栏是针对NodeJS
的,所以本篇文章侧重于讲解NodeJS
如何连接并操作MongoDB
数据库,并不会对MongoDB
的安装配置以及原生的操作语法做过多的讲解(这些网上已经有很多的教程了,想深入了解的可自行搜索)。
1️⃣ 数据库类型
🔹 关系型数据库
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织。
结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;
优点:
- 易于维护:都是使用表结构,格式一致;
- 使用方便:
SQL
语言通用,可用于复杂查询; - 复杂操作:支持
SQL
,可用于一个表以及多个表之间非常复杂的查询。
缺点:
- 读写性能比较差,尤其是海量数据的高效率读写;
- 固定的表结构,灵活度稍欠;
- 高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
常见的关系型数据库有mysql
、sqlserver
、db2
、oracle
。
🔹 非关系型数据库
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。
NoSQL
,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。
优点:
- 格式灵活:存储数据的格式可以是
key,value
形式、文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。 - 速度快:
nosql
可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘; - 高扩展性;
- 成本低:
nosql
数据库部署简单,基本都是开源软件。
缺点:
- 不提供
sql
支持,这意味着我们需要额外学习专门针对非关系型数据库的查询语言,并且不同的非关系型数据库使用的语言也可能不同; - 无事务处理;
- 数据结构相对复杂,复杂查询方面稍欠。
常见的非关系型数据库有mongodb
、Hbase
、Redis
。
🔹 区别
关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
SQL
关系型数据库与MongoDB
数据库的一些术语区别:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 无 | 表连接/MongoDB不支持 |
primary key | primary key | 主键/MongoDB自动将_id字段设置为主键 |
🔹 为什么选择MongoDB?
- 由于
MongoDB
独特的数据处理方式,可以将热点数据加载到内存,故而对查询来讲会非常快(当然也会非常消耗内存) ; - 同时由于采用了
BSON
的方式存储数据,故而对JSON
格式数据具有非常好的支持性以及友好的表结构修改性,文档式的存储方式,数据友好可见; - 数据库的分片集群负载具有非常好的扩展性以及非常不错的自动故障转移。
2️⃣ 在命令行中操作数据库
🔹 数据库操作
Help查看命令提示:
help
db.help()
db.test.help()
db.test.find().help()
上面是四条命令,每一行都是一条单独的命令,并不是一个整体,这里只是用这四条命令演示help的使用
创建/切换数据库:
# 创建/切换到music数据库
use music
查询数据库:
show dbs
查看当前使用的数据库:
db
# 或
db.getName()
显示当前数据库的状态:
db.status()
查看当前数据库的版本:
db.version()
查看当前数据库的链接机器地址:
db.getMongo()
删除数据库:
db.dropDatabase()
🔹 集合操作
创建一个聚集集合:
# 创建一个最大存储空间为5M,最多5000个文档的集合
db.createCollection("collName",{size:5242880,capped:true,max:5000});
得到指定名称的聚集集合:
# 得到account集合
db.getCollection("account");
得到当前db的所有聚集集合:
db指的就是数据库,所以是得到当前数据库的所有聚集集合
db.getCollectionNames();
显示当前db的所有聚集集合的状态:
db.printCollectionStats();
删除聚集集合:
# 删除users集合
db.users.drop();
🔹 文档操作
MongoDB中的一个文档就相当于是一条数据
添加:
# 向users集合中添加文档
# 添加一条文档
db.users.save({name:'Ailjx',age:18,sex:true});
# 添加多条文档
db.users.save({name:'Ailjx',age:18,sex:true},{name:'Ailjx2',age:18});
修改:
# 将users集合中age为25的文档的name字段修改为changeName
db.users.update({age:25},{$set:{name:'changeName'}},false,true);
# 将users集合中name为'ailjx'的文档的age字段的值加5
db.users.update({name:'ailjx'},{$inc:{age:5}},false,true);
# 将users集合中name为'ailjx'的文档的age字段的值加5并将name字段修改为A
db.users.update({name:'ailjx'},{$inc:{age:5},$set:{name:'A'}},false,true);
删除:
# 删除users集合中age为132的文档
db.users.remove({age:132});
# 删除users集合中所有文档
db.users.remove({});
查询:
# 查询users集合中的所有记录(文档/数据)
db.users.find();
# 查询age=22的记录
db.users.find({"age":22});
# 查询name=zhangsan,age=22的数据
db.users.find({name:'zhangsan',age:22});
# 查询name字段去重后的数据
db.users.distinct("name");
# 查询age>22的记录
db.users.find({age:{$gt:22}});
# 查询age>=22的记录
db.users.find({age:{$gte:22}});
# 查询age<22的记录
db.users.find({age:{$lt:22}});
# 查询age<=22的记录
db.users.find({age:{$lte:22}});
# 查询age>=21并且age<=26的记录
db.users.find({age:{$gte:21,$lte:26}});
# 查询name字段中包含mongo的数据(模糊查询)
db.users.find({name:/mongo/); # 使用正则
# 查询name字段中以mongo开头的数据(模糊查询)
db.users.find({name:/^mongo/);
# 查询指定列name、age数据(想显示哪列就将字段设置为1,不想显示就设置成0)
db.users.find({},{name:1,age:1);
# 查询指定列name、age且age>25的数据
db.users.find({age:{$gt:25}},{name:1,age:1);
# 按照age排序(写成数组就是多列查询)
db.users.find().sort({age:1}); # 升序
db.users.find().sort({age:-1}); # 降序
# 查询前5条数据
db.users.find().limit(5);
# 查询10条以后的数据
db.users.find().skip(10);
# 查询在5-10条之间的数据
db.users.find().skip(5).limit(5);
# or查询
db.users.find({$or:[{age:22},{age:25}]}); # 查询age=22的或age=25的数据
# 查询第一条数据
db.users.findOne();
# 查询某个结果集的记录条数
db.users.find({age:{$gte:25}}).count(); # 查询age>=25的记录共有多少条
3️⃣ Nodejs连接操作数据库
mongoose中文文档
安装Mongoose
:
npm i mongoose
Mongoose
是一个对象文档模型(ODM
)库,它对Node
原生的MongoDB
模块进行了进一步的优化封装,并提供了更多的功能。
在Nodejs
中引用Mongoose
:
// 引入Mongoose
const mongoose = require("mongoose");
// 连接数据库
// 前缀mongodb:是固定的,后面是你的mongodb的运行端口(默认是127.0.0.1:27017)
// server_test代表数据库名称
mongoose.connect("mongodb://127.0.0.1:27017/server_test");
// 当你插入集合和数据时,数据库server_test会自动创建
🔹 创建模型
创建的这个模型主要就是用来定义一个集合的结构(集合的文档具有哪些字段以及其对应的数据类型)
// UserModel.js
const mongoose = require("mongoose");
const Schema = mongoose.Schema
// 字段类型
const UserType = {
username: String,
password: String,
age: Number,
};
// 创建一个模型(user),对应数据库中的集合(表)(users)
const UserModel = mongoose.model("user", new Schema(UserType));
// 注意:创建的mongodb的集合名称是加s的
// mongoose.model第二个参数可以通过mongoose.Schema生成的实例来限制集合字段类型
// 因为mongodb过于自由,对类型没有限制,我们在开发中往往需要使用mongoose.Schema来手动限制数据库各种字段类型
module.exports = UserModel;
这个模型我们起名为UserModel
,定义了一个存放用户信息的集合users
,包含username
、 password
、 age
三个字段。
当我们引入这个模型进行插入数据后,server_test
数据库中就会自动创建users
集合用来存放我们插入的数据。
注意: 我们在代码中指定的是"user"
,但MongoDB
实际创建的集合是users
(会自动加上s
)。
🔹 数据操作
mongoose
为我们提供了很多的api
,大家可去mongoose中文文档进行查阅:
这里只演示部分api
的应用:
添加数据:
// 引入对应的模型
const UserModel = require("../model/UserModel");
// 插入数据库
UserModel.create({ username:'Ailjx', password:'11111', age:18 })
.then((data) => {
// ...
})
.catch((error) => {
console.log(error);
// ...
});
对模型的操作是异步的(promise
),支持then
回调来捕捉成功的状态,catch
回调捕捉失败的状态。
删除数据:
// 引入对应的模型
const UserModel = require("../model/UserModel");
// 删除数据
// deleteOne删除一条数据
UserModel.deleteOne({ _id: '44'})
.then((data) => {
// ...
})
.catch((error) => {
console.log(error);
// ...
});
更新数据:
// 引入对应的模型
const UserModel = require("../model/UserModel");
// 更新数据
// updateOne更新一条数据
UserModel.updateOne(
{ _id: '444'},
{
username:'1',
password:'1',
age:18,
}
)
.then((data) => {
// "更新成功!"
})
.catch((error) => {
console.log(error);
// "更新失败!"
});
查询数据:
// 引入对应的模型
const UserModel = require("../model/UserModel");
UserModel.find()
.count() // count方法,获取数据数量
.then((dataCount) => {
// find查询,第二个参数数组指定获取的字段,这里是获取username和age以及id(默认具有),不获取password
UserModel.find({}, ["username", "age"])
// sort排序,按照age:1(正序)排序,age:-1为倒叙
.sort({ age: 1 })
// skip方法,代表跳过几条数据开始获取
.skip(10)
// limit方法,代表取多少条数据
.limit(5)
.then((data) => {
// 查询成功
});
});
🔼 结语
博主的Node.js从入门到精通专栏正在持续更新中,关注博主订阅专栏学习Node不迷路!
如果本篇文章对你有所帮助,还请客官一件四连!❤️