【前端】NodeJS:MongoDB

子非鱼921 2024-10-01 09:33:01 阅读 77

文章目录

1 简介1.1 MongoDB是什么1.2 数据库是什么1.3 数据库的作用1.4 数据库管理数据的特点1.5 为什么选择MongoDB

2 核心概念3 下载安装与启动4 命令行交互4.1 数据库命令4.2 集合命令4.3 文档命令4.4 应用场景4.4.1 新增4.4.2 删除4.4.3 更新4.4.4 查询

5 Mongoose5.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文件示例:

<code>{ -- -->

"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 类型, 通用性更强。

配置步骤如下:

将压缩包移动到C:\Program Files下,然后解压。创建C:\data\db目录,mongodb会将数据默认保存在这个文件夹。以mongodb中 bin目录作为工作目录,启动命令行。运行命令mongod。看到最后的" waiting for connections "则表明服务已经启动成功。然后可以使用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({ $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进行交互,这里给出两个图形化工具:

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

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

});



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。