【前端】NodeJS:MongoDB

文章目录
  • [1 简介](#1 简介)
    • [1.1 MongoDB是什么](#1.1 MongoDB是什么)
    • [1.2 数据库是什么](#1.2 数据库是什么)
    • [1.3 数据库的作用](#1.3 数据库的作用)
    • [1.4 数据库管理数据的特点](#1.4 数据库管理数据的特点)
    • [1.5 为什么选择MongoDB](#1.5 为什么选择MongoDB)
  • [2 核心概念](#2 核心概念)
  • [3 下载安装与启动](#3 下载安装与启动)
  • [4 命令行交互](#4 命令行交互)
    • [4.1 数据库命令](#4.1 数据库命令)
    • [4.2 集合命令](#4.2 集合命令)
    • [4.3 文档命令](#4.3 文档命令)
    • [4.4 应用场景](#4.4 应用场景)
      • [4.4.1 新增](#4.4.1 新增)
      • [4.4.2 删除](#4.4.2 删除)
      • [4.4.3 更新](#4.4.3 更新)
      • [4.4.4 查询](#4.4.4 查询)
  • [5 Mongoose](#5 Mongoose)
    • [5.1 介绍](#5.1 介绍)
    • [5.2 作用](#5.2 作用)
    • [5.3 连接数据库](#5.3 连接数据库)
    • [5.4 创建新文档](#5.4 创建新文档)
    • [5.5 字段类型](#5.5 字段类型)
    • [5.6 字段值验证](#5.6 字段值验证)
    • [5.7 增删改查](#5.7 增删改查)
      • [5.7.1 增加](#5.7.1 增加)
      • [5.7.2 更新](#5.7.2 更新)
      • [5.7.3 删除](#5.7.3 删除)
      • [5.7.4 查询](#5.7.4 查询)
    • [5.8 条件控制](#5.8 条件控制)
      • [5.8.1 运算符](#5.8.1 运算符)
      • [5.8.2 逻辑运算](#5.8.2 逻辑运算)
      • [5.8.3 正则匹配](#5.8.3 正则匹配)
    • [5.9 个性化读取](#5.9 个性化读取)
      • [5.9.1 字段筛选](#5.9.1 字段筛选)
      • [5.9.2 数据排序](#5.9.2 数据排序)
      • [5.9.3 数据截取](#5.9.3 数据截取)
  • [6 图形化管理工具](#6 图形化管理工具)
  • [7 mongoose模块化](#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文件示例:

    {

    "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:datadb目录,mongodb会将数据默认保存在这个文件夹。
  3. 以mongodb中 bin目录作为工作目录,启动命令行。
  4. 运行命令mongod
  5. 看到最后的" waiting for connections "则表明服务已经启动成功。
  6. 然后可以使用mongo命令连接本机的mongodb服务。

注意:

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

4 命令行交互

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

4.1 数据库命令

  • 显示所有的数据库:show dbs
  • 切换到指定的数据库,如果数据库不存在会自动创建数据库:use 数据库名
  • 显示当前所在的数据库:db
  • 删除当前数据库:
    use 库名
    db.dropDatabase()

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 连接数据库

//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 创建新文档

//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

日期

Buffer

Buffer 对象

Mixed

任意类型,需要使用 mongoose.Schema.Types.Mixed 指定

ObjectId

对象 ID,需要使用 mongoose.Schema.Types.ObjectId 指定

Decimal128

高精度数字,需要使用 mongoose.Schema.Types.Decimal128 指定

/**
 * 存储图片、视频等资源时,会将其存在静态资源文件夹下,
 * 把资源对应的的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有一些内建验证器,可以对字段值进行验证。

/**
 * 字段验证:对文档属性的值进行校验,检查通过就插入数据库,如果不合法就禁止插入
 * 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 增加
  • 插入一条数据:

    SongModel.create({

    title:'给我一首歌的时间',

    author: 'Jay'

    }, function(err, data){

    //错误

    console.log(err);

    //插入后的数据对象

    console.log(data);

    });

  • 批量插入数据:

    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 更新
  • 更新一条数据:

    SongModel.updateOne({author: 'JJ Lin'}, {author: '林俊杰'}, function (err) {

    if(err) throw err;

    mongoose.connection.close();

    });

  • 批量更新数据:

    SongModel.updateMany({author: 'Leehom Wang'}, {author: '王力宏'}, function (err) {

    if(err) throw err;

    mongoose.connection.close();

    });

5.7.3 删除
  • 删除一条数据:

    SongModel.deleteOne({_id:'5dd65f32be6401035cb5b1ed'}, function(err){

    if(err) throw err;

    console.log('删除成功');

    mongoose.connection.close();

    });

  • 批量删除数据:

    SongModel.deleteMany({author:'Jay'}, function(err){

    if(err) throw err;

    console.log('删除成功');

    mongoose.connection.close();

    });

5.7.4 查询
  • 查询一条数据:

    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();

    });

  • 批量查询数据:

    //不加条件查询,读取所有

    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

//价格小于 20 的图书
BookModel.find({price: {$lt: 20}}, (err, data) => {
	if(err) {
    	console.log('读取失败~~');
		return;
	}
	console.log(data);
})
5.8.2 逻辑运算
  • $or:逻辑或

  • $and:逻辑与

    //曹雪芹 或者 余华的书

    BookModel.find({$or: [{author: '曹雪芹'}, {author: '余华'}]}, (err, data) => {

    if (err) {

    console.log('读取失败~~');

    return;

    }

    console.log(data);

    })

    //价格大于 30 且小于 70

    BookModel.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: and: [{price: {gt: 30}}, {price: {$lt: 70}}]}, (err, data) => {

    if (err) {

    console.log('读取失败~~');

    return;

    }

    console.log(data);

    })

5.8.3 正则匹配

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

//正则表达式, 搜索书籍名称中带有 `三` 的图书
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 字段筛选
//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 数据排序
//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 数据截取
//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进行交互,这里给出两个图形化工具:

7 mongoose模块化

  • config.js:

    //配置文件

    module.exports = {

    DBHOST: '127.0.0.1',

    DBPORT: 27017,

    DBNAME: 'bilibili'

    }

  • db.js:

    /**

    *

    • @param {*} success 数据库连接成功的回调

    • @param {*} error 数据库连接失败的回调

      */

      module.exports = function (success, error) {

      //判断 error 为其设置默认值

      if(typeof error !== 'function'){

      error = () => {

      console.log('连接失败~~~');

      }

      }

      //1. 安装 mongoose

      //2. 导入 mongoose

      const mongoose = require('mongoose');

      //导入 配置文件

      const {DBHOST, DBPORT, DBNAME} = require('.../config/config.js');

      //设置 strictQuery 为 true

      mongoose.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:

    //导入 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:

    //导入 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('连接失败...');

    });

相关推荐
万维——组态2 分钟前
web组态可视化编辑器
前端·物联网·低代码·编辑器·流程图·组态
飞舞花下5 分钟前
vue el-dialog实现可拖拉
前端·javascript·vue.js
代码小鑫8 分钟前
【毕业设计】A079-基于Java的影院订票系统的设计与实现
java·开发语言·数据库·spring boot·后端·毕业设计·课程设计
决斗小饼干13 分钟前
大文件传输与断点续传实现(极简Demo:React+Node.js)
前端
铅华尽13 分钟前
前端JavaScript(六)---JS中的事件
开发语言·前端·javascript
DashVector17 分钟前
如何通过HTTP API新建Collection
数据库·人工智能·http·阿里云·向量检索
肉肉心很软18 分钟前
本地项目显示正常,打包部署后ElementUI重点饿图标全部显示异常为小方框
前端·elementui
那你能帮帮我吗20 分钟前
element-ui的el-color-picker颜色选择器组件,弹窗定位在左上角的问题排查和解决
前端·element
明月看潮生30 分钟前
青少年编程与数学 02-004 Go语言Web编程 02课题、依赖管理
开发语言·前端·青少年编程·编程与数学·goweb
minstbe1 小时前
WEB开发: Node.js路由之由浅入深(三)自动配置路由 - 全栈工程师入门
前端·node.js