【前端】NodeJS:MongoDB

news/2024/11/14 3:11:31/

文章目录

  • 1 简介
  • 2 核心概念
  • 3 下载安装与启动
  • 4 命令行交互
    • 4.1 数据库命令
    • 4.2 集合命令
    • 4.3 文档命令
    • 4.4 应用场景
      • 4.4.1 新增
      • 4.4.2 删除
      • 4.4.3 更新
      • 4.4.4 查询
  • 5 Mongoose
    • 5.1 介绍
    • 5.2 作用
    • 5.3 连接数据库
    • 5.4 创建新文档
    • 5.5 字段类型
    • 5.6 字段值验证
    • 5.7 增删改查
      • 5.7.1 增加
      • 5.7.2 更新
      • 5.7.3 删除
      • 5.7.4 查询
    • 5.8 条件控制
      • 5.8.1 运算符
      • 5.8.2 逻辑运算
      • 5.8.3 正则匹配
    • 5.9 个性化读取
      • 5.9.1 字段筛选
      • 5.9.2 数据排序
      • 5.9.3 数据截取
  • 6 图形化管理工具
  • 7 mongoose模块化

1 简介

1.1 MongoDB是什么

MongoDB是一个基于分布式文件存储的数据库,官方地址:https://www.mongodb.com/。

1.2 数据库是什么

数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序。

1.3 数据库的作用

数据库的主要作用就是管理数据,对数据进行增(c)、删(d)、改(u)、查(r)。

1.4 数据库管理数据的特点

相比于纯文件管理数据,数据库管理数据有如下特点:速度更快、扩展性更强、安全性更强。

1.5 为什么选择MongoDB

操作语法与JavaScript类似,容易上手,学习成本低。

2 核心概念

MongoDB中有三个重要概念需要掌握:

  • 数据库(database)数据库是一个数据仓库,数据库服务下可以创建很多数据库数据库中可以存放很多集合。
  • 集合(collection)集合类似于JS中的数组,在集合中可以存放很多文档。
  • 文档(document)文档是数据库中的最小单位,类似于JS中的对象。
    JSON文件示例:
javascript">{"accounts": [{"id": "3-YLju5f3","title": "买电脑","time": "2023-02-08","type": "-1","account": "5500","remarks": "为了上网课"},{"id": "mRQiD4s3K","title": "发工资","time": "2023-02-19","type": "1","account": "14396","remarks": "终于发工资啦!~~"}],"users":[{"id": 1,"name": "zhangsan","age": 18},{"id": 2,"name": "lisi","age": 20}]
}

可以通过JSON文件来理解MongoDB中的概念:

  • 一个JSON 文件好比是一个数据库,一个MongoDB服务下可以有N个数据库
  • JSON文件中的一级属性的数组值好比是集合。
  • 数组中的对象好比是文档。
  • 对象中的属性有时也称之为字段。
  • 一般情况下:
    一个项目使用一个数据库
    一个集合会存储同一种类型的数据。

3 下载安装与启动

下载地址:https://www.mongodb.com/try/download/community,建议选择 zip 类型, 通用性更强。
配置步骤如下:

  1. 将压缩包移动到C:\Program Files下,然后解压。
  2. 创建C:\data\db目录,mongodb会将数据默认保存在这个文件夹。
  3. mongodb中 bin目录作为工作目录,启动命令行。
  4. 运行命令mongod
  5. 看到最后的" waiting for connections "则表明服务已经启动成功。
  6. 然后可以使用mongo命令连接本机的mongodb服务。

注意:

  • 为了方便后续使用mongod命令,可以将bin目录配置到环境变量Path中。
  • 千万不要选中服务端窗口的内容,选中会停止服务,可以敲回车取消选中。

4 命令行交互

命令行交互一般是学习数据库的第一步,不过这些命令在后续用的比较少,所以大家了解即可。

4.1 数据库命令

4.2 集合命令

  • 创建集合:db.createCollection('集合名称')
  • 显示当前数据库中的所有集合:show collections
  • 删除某个集合:db.集合名.drop()
  • 重命名集合:db.集合名.renameCollection('newName')

4.3 文档命令

  • 插入文档:db.集合名.insert(文档对象)
  • 查询文档:db.集合名.find(查询条件)
    _id 是mongodb自动生成的唯一编号,用来唯一标识文档。
  • 更新文档:
    db.集合名.update(查询条件,新的文档)
    db.集合名.update({name:'张三'},{$set:{age:19}})
  • 删除文档:db.集合名.remove(查询条件)

4.4 应用场景

4.4.1 新增

  • 用户注册
  • 发布视频
  • 发布商品
  • 发朋友圈
  • 发评论
  • 发微博
  • 发弹幕

4.4.2 删除

  • 删除评论
  • 删除商品
  • 删除文章
  • 删除视频
  • 删除微博

4.4.3 更新

  • 更新个人信息
  • 修改商品价格
  • 修改文章内容

4.4.4 查询

  • 商品列表
  • 视频列表
  • 朋友圈列表
  • 微博列表
  • 搜索功能

5 Mongoose

5.1 介绍

Mongoose是一个对象文档模型库,官网:http://www.mongoosejs.net/。

5.2 作用

方便使用代码操作MongoDB数据库

5.3 连接数据库

javascript">//1. 安装 mongoose
//2. 导入 mongoose
const mongoose = require('mongoose');//设置 strictQuery 为 true,处理禁用警告
mongoose.set('strictQuery', true);//3. 连接 mongodb 服务 mongodb协议 默认端口号27017 数据库的名称(如果数据库不存在,自动创建)
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');//4. 设置回调
// 设置连接成功的回调  once 一次   事件回调函数只执行一次
mongoose.connection.once('open', () => {console.log('连接成功');// app.listen(8080);
});// 设置连接错误的回调
mongoose.connection.on('error', () => {console.log('连接失败');
}); //设置连接关闭的回调
mongoose.connection.on('close', () => {console.log('连接关闭');
}); //关闭 mongodb 的连接
// setTimeout(() => {
//   mongoose.disconnect();
// }, 2000)

5.4 创建新文档

javascript">//4. 设置回调
// 设置连接成功的回调  once 一次   事件回调函数只执行一次
mongoose.connection.once('open', () => {//5. 创建文档的结构对象//设置集合中文档的属性以及属性值的类型let BookSchema = new mongoose.Schema({name: String,author: String,price: Number});//6. 创建模型对象  对文档操作的封装对象,mongoose.model(集合名称,结构对象)let BookModel = mongoose.model('books', BookSchema);//7. 新增BookModel.create({name: '西游记',author: '吴承恩',price: 19.9}, (err, data) => {//判断是否有错误if(err) {console.log(err);return;}//如果没有出错, 则输出插入后的文档对象console.log(data); //data 插入成功后的文档对象,mongodb自定生成编号和版本号//8. 关闭数据库连接 (项目运行过程中, 不会添加该代码)mongoose.disconnect();});
}); 

5.5 字段类型

文档结构可选的常用字段类型列表。

类型描述
String字符串
Number数字
Boolean布尔值
Array数组,也可以使用 [ ] 来标识
Date日期
BufferBuffer 对象
Mixed任意类型,需要使用 mongoose.Schema.Types.Mixed 指定
ObjectId对象 ID,需要使用 mongoose.Schema.Types.ObjectId 指定
Decimal128高精度数字,需要使用 mongoose.Schema.Types.Decimal128 指定
javascript">/*** 存储图片、视频等资源时,会将其存在静态资源文件夹下,* 把资源对应的的url以字符串的形式存在数据库中,将来再用时,* 直接到静态资源文件夹中根据url查找对应的资源即可,* 所以很少将图片存入数据库中。*/
//4. 设置回调
// 设置连接成功的回调  once 一次   事件回调函数只执行一次
mongoose.connection.once('open', () => {//5. 创建文档的结构对象//设置集合中文档的属性以及属性值的类型let BookSchema = new mongoose.Schema({name: String,author: String,price: Number,is_hot: Boolean,tags: Array,pub_time: Date,test: mongoose.Schema.Types.Mixed//test: mongoose.Schema.Types.ObjectId // 文档 ID,一般做外键(做联合查询)});//6. 创建模型对象  对文档操作的封装对象let BookModel = mongoose.model('books', BookSchema);//7. 新增BookModel.create({name: '西游记',author: '吴承恩',price: 19.9,is_hot: true,tags: ['鬼怪','励志','社会'],pub_time: new Date(),test: new Date()}, (err, data) => {//判断是否有错误if(err) {console.log(err);return;}//如果没有出错, 则输出插入后的文档对象console.log(data);//8. 关闭数据库连接 (项目运行过程中, 不会添加该代码)mongoose.disconnect();});
});

5.6 字段值验证

Mongoose有一些内建验证器,可以对字段值进行验证。

javascript">/*** 字段验证:对文档属性的值进行校验,检查通过就插入数据库,如果不合法就禁止插入* unique 需要重建集合才能有效果*/
//设置集合中文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({name: {type: String,required: true, // 设置必填项 // 表明该属性必须不为空unique: true // 设置为独一无二的,唯一值},author: {type: String,default: '匿名' //默认值},//类型style: {type: String,//枚举enum: ['言情','城市','志怪','恐怖'] //设置的值必须是数组中的},price: Number
});

5.7 增删改查

数据库的基本操作包括四个,增加(create),删除(delete),修改(update),查(read)。

5.7.1 增加

  • 插入一条数据:
javascript">SongModel.create({title:'给我一首歌的时间',author: 'Jay'
}, function(err, data){//错误console.log(err);//插入后的数据对象console.log(data);
});
  • 批量插入数据:
javascript">PhoneModel.insertMany([{brand:'华为',color:'灰色',price:2399,tags:['电量大','屏幕大','信号好']},{brand:'小米',color:'白色',price:2099,tags:['电量大','屏幕大','信号好']}
],(err,data)=>{if(err) throw err;console.log('写入成功');mongoose.connection.close();
})

5.7.2 更新

  • 更新一条数据:
javascript">SongModel.updateOne({author: 'JJ Lin'}, {author: '林俊杰'}, function (err) {if(err) throw err;mongoose.connection.close();
});
  • 批量更新数据:
javascript">SongModel.updateMany({author: 'Leehom Wang'}, {author: '王力宏'}, function (err) {if(err) throw err;mongoose.connection.close();
});

5.7.3 删除

  • 删除一条数据:
javascript">SongModel.deleteOne({_id:'5dd65f32be6401035cb5b1ed'}, function(err){if(err) throw err;console.log('删除成功');mongoose.connection.close();
});
  • 批量删除数据:
javascript">SongModel.deleteMany({author:'Jay'}, function(err){if(err) throw err;console.log('删除成功');mongoose.connection.close();
});

5.7.4 查询

  • 查询一条数据:
javascript">SongModel.findOne({author: '王力宏'}, function(err, data){if(err) throw err;console.log(data);mongoose.connection.close();
});
//根据 id 查询数据
SongModel.findById('5dd662b5381fc316b44ce167',function(err, data){if(err) throw err;console.log(data);mongoose.connection.close();
});
  • 批量查询数据:
javascript">//不加条件查询,读取所有
SongModel.find(function(err, data){if(err) throw err;console.log(data);mongoose.connection.close();
});
//加条件查询,批量读取
SongModel.find({author: '王力宏'}, function(err, data){if(err) throw err;console.log(data);mongoose.connection.close();
});

5.8 条件控制

5.8.1 运算符

mongodb不能 > < >= <= !== 等运算符,需要使用替代符号

运算符替代符号
>$gt
<$lt
>=$gte
<=$lte
!==$ne
javascript">//价格小于 20 的图书
BookModel.find({price: {$lt: 20}}, (err, data) => {if(err) {console.log('读取失败~~');return;}console.log(data);
})

5.8.2 逻辑运算

  • $or:逻辑或
  • $and:逻辑与
javascript">//曹雪芹 或者 余华的书
BookModel.find({$or: [{author: '曹雪芹'}, {author: '余华'}]}, (err, data) => {if (err) {console.log('读取失败~~');return;}console.log(data);
})//价格大于 30 且小于 70
BookModel.find({$and: [{price: {$gt: 30}}, {price: {$lt: 70}}]}, (err, data) => {if (err) {console.log('读取失败~~');return;}console.log(data);
})

5.8.3 正则匹配

条件中可以直接使用JS的正则语法,通过正则可以进行模糊查询。

javascript">//正则表达式, 搜索书籍名称中带有 `三` 的图书
BookModel.find({name: //}, (err, data) => {if (err) {console.log('读取失败~~');return;}console.log(data);
})//正则表达式的这种定义形式能够解析变量的值
BookModel.find({name: new RegExp('三')}, (err, data) => {if (err) {console.log('读取失败~~');return;}console.log(data);
})

5.9 个性化读取

5.9.1 字段筛选

javascript">//0:不要的字段
//1:要的字段
BookModel.find().select({name: 1, author: 1, _id: 0}).exec((err, data) => {if(err) {console.log('查询失败~~');return;}console.log(data);
})

5.9.2 数据排序

javascript">//sort 排序
//1:升序
//-1:倒序
BookModel.find().select({name: 1, price: 1, _id: 0}).sort({price: -1}).exec((err, data) => {if(err) {console.log('查询失败~~');return;}console.log(data);
})

5.9.3 数据截取

javascript">//skip 跳过 limit 限定
//数据的截取,跨过3个取3个
BookModel.find()
.select({name: 1, price: 1, _id: 0})
.sort({price: -1})
.skip(3)
.limit(3)
.exec((err, data) => {if(err) {console.log('查询失败~~');return;}console.log(data);
})

6 图形化管理工具

我们可以使用图形化的管理工具来对Mongodb进行交互,这里给出两个图形化工具:

  • Robo 3T:免费,https://github.com/Studio3T/robomongo/releases。
  • Navicat:收费,https://www.navicat.com.cn/。

7 mongoose模块化

  • config.js:
javascript">//配置文件
module.exports = {DBHOST: '127.0.0.1',DBPORT: 27017,DBNAME: 'bilibili'
}
  • db.js:
javascript">/*** * @param {*} success 数据库连接成功的回调* @param {*} error 数据库连接失败的回调*/
module.exports = function (success, error) {//判断 error 为其设置默认值if(typeof error !== 'function'){error = () => {console.log('连接失败~~~');}}//1. 安装 mongoose//2. 导入 mongooseconst mongoose = require('mongoose');//导入 配置文件const {DBHOST, DBPORT, DBNAME} = require('../config/config.js');//设置 strictQuery 为 truemongoose.set('strictQuery', true);//3. 连接 mongodb 服务                        数据库的名称mongoose.connect(`mongodb://${DBHOST}:${DBPORT}/${DBNAME}`);//4. 设置回调// 设置连接成功的回调  once 一次   事件回调函数只执行一次mongoose.connection.once('open', () => {success();});// 设置连接错误的回调mongoose.connection.on('error', () => {error();});//设置连接关闭的回调mongoose.connection.on('close', () => {console.log('连接关闭');});
}
  • BookModel.js:
javascript">//导入 mongoose
const mongoose = require('mongoose');
//创建文档的结构对象
//设置集合中文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({name: String,author: String,price: Number
});//创建模型对象  对文档操作的封装对象
let BookModel = mongoose.model('books', BookSchema);//暴露模型对象
module.exports = BookModel;
  • index.js:
javascript">//导入 db 文件
const db = require('./db/db');
//导入 mongoose
const mongoose = require('mongoose');
//导入 BookModel
const BookModel = require('./models/BookModel');// 调用函数
db(() => {//7. 新增BookModel.create({name: '西游记',author: '吴承恩',price: 19.9}, (err, data) => {//判断是否有错误if(err) {console.log(err);return;}//如果没有出错, 则输出插入后的文档对象console.log(data);//8. 关闭数据库连接 (项目运行过程中, 不会添加该代码)mongoose.disconnect();});
}, () => {console.log('连接失败...');
});

http://www.ppmy.cn/news/1509085.html

相关文章

CentOS7.6 RabbitMQ消息队列集群部署——实施方案

1、前期环境准备&#xff08;每个主机都配置&#xff09; 1.准备三台主机 IP地址主机名内存大小192.168.200.10 rabbitmq1 2G192.168.200.11rabbitmq22G192.168.200.55rabbitmq32G 2. 设置主机名 hostnamectl set-hostname 主机名suexit Ctrlr 3. 设置IP地址然后重启网卡 …

20240810从串口查看荣品RK3588S-AHD开发板出厂预置的Android的版本

20240810从串口查看荣品RK3588S-AHD开发板出厂预置的Android的版本 2024/8/10 16:46 1、通过串口&#xff1a; console:/ # console:/ # getprop ro.build.version.release 13 console:/ # 【请严重注意&#xff0c;adb的那条USB2.0的公公线&#xff0c;一定要插到蓝色的USB3…

高等数学/概率论/数理统计/线性代数/离散数学面试-核心概念-问题理解

目录 1.特征值与特征向量 2.矩阵的秩&#xff0c;满秩代表什么&#xff1f;怎么判断满秩&#xff1f; 3.奇异值分解 4.正定矩阵 5.线性相关和线性无关 6.全概率公式与贝叶斯公式 7.极大似然估计 8.大数定律与中心极限定理 9.傅立叶变换 10.连续与可导有什么关系&#…

Open3D 计算点云的协方差矩阵(原理详细版)

目录 一、概述 1.1协方差矩阵的定义 1.2实现步骤 1.3应用 二、代码实现 1.1实现代码 2.2协方差应用案例 2.2.1主成分分析法的应用 2.2.2平面拟合 三、疑问解答 3.1为什么计算协方差矩阵要去质心&#xff1f; 3.1.1原因 3.1.2区别 Open3D点云算法汇总及实战案例汇总…

【数学分析笔记】第1章第2节:映射与函数(3)

1. 集合与映射 1.15.4 函数的参数表示 自变量 x x x和因变量 y y y不好直接表示&#xff0c;可以引入参数 t t t&#xff0c;则 { x x ( t ) y y ( t ) , t ∈ [ a , b ] \left\{\begin{array}{ll} xx(t) \\ yy(t) \end{array}\right.,t\in[a,b] {xx(t)yy(t)​,t∈[a,b]&am…

HTTP的场景实践

HTTP的场景实践&#xff1a;任选一个浏览器&#xff0c;对于其涉及的请求中的缓存策略展开具体分析 1. 强缓存&#xff1a; Cache-Control用于指定缓存的最长有效时间。 Expires用于指定资源过期的日期。 2. 协商缓存&#xff1a; ETag用于标识资源的唯一标识符&#xff0c;…

vue3 中 ref 使用 ts 中的接口定义类型

在 Vue 3 中&#xff0c;当使用 TypeScript 结合 ref 时&#xff0c;可以通过接口来定义其类型。 首先&#xff0c;定义一个接口&#xff1a; interface User {name: string;age: number;} 然后在组件中使用 ref &#xff1a; import { ref } from "vue";const u…

简单介绍一下css中transform的内容

在CSS中&#xff0c;transform属性用于对元素进行变换&#xff0c;包括旋转、缩放、倾斜和平移等操作。以下是transform属性中常用的属性&#xff1a; translate&#xff1a;用于元素的平移操作&#xff0c;可以指定元素在X轴和Y轴方向上的平移距离。 rotate&#xff1a;用于元…