尚硅谷 P130 - P150
一、Mongdb介绍
Mongdb是数据库,本质是按照数据结构来组织、存储和管理数据的应用程序;
作用是,管理数据,对数据进行 增、删、改、查。
为什么选择学习Mongdb这个数据库?
因为操作语法和js类似,易于上手。
二、核心概念
数据库:一个json文件就 相当于一个数据库;
集合:json文件中的一级数组就 相当于一个集合;
文档:一个集合里的每个对象{} 相当于一个文档。
一个项目中使用一个数据库,即有一个json文件;
一个集合会存储一个类型的文档。
三、下载安装与启动
下载地址: Download MongoDB Community Server | MongoDB
mac电脑安装参考文章:
开启服务 mongod --dbpath /usr/local/mongodb/data --logpath /usr/local/mongodb/logs/mongodb.log
使用服务 mongo
四、数据库与集合命令
这些命令不常用,了解一下
五、文档命令
六、数据库操作应用场景
七、mongoose介绍
有了mongoose就不用直接在命令行窗口手动输入命令来操作数据库了,通过程序来操作数据库,就是mongoose的作用。
mongoose的本质就是一个包。
八、连接数据库
bug解决:一定要将node.js的版本切换为16,否则一直报错,教训~~~~~
1、新建一个文件夹
2、初始化项目 npm inital
3、安装mangoose npm i mongoose
4、创建 js 文件
5、开启数据库 mongod --config /usr/local/mongodb/etc/mongod.conf
如果在浏览器中输入 地址 http://localhost:27017出现英文则说明MongDB启动成功。
6、运行数据库 mongo
7、运行js文件
// 1、安装 mongoose npm i mongoose // 2、导入 mongoose const mongoose = require('mongoose') // 3、连接 mongodb 服务 // mongodb 表示 协议版本 // 27017 表示 默认的端口号 // bilibili 表示数据库,如果没有的话,会自动创建该数据库 mongoose.connect('mongodb://127.0.0.1:27017/admin') // 4、设置回调 // 设置连接成功的回调 mongoose.connection.on('open', () =>{ console.log('连接成功') }) // 设置连接错误的回调 mongoose.connection.on('error', () =>{ console.log('连接失败') }) // 设置连接关闭的回调 mongoose.connection.on('close', ()=>{ console.log('连接关闭') }) // 关闭 mongodb 的连接 setTimeout(() =>{ mongoose.disconnect() }, 2000)
九、连接数据库补充说明
连接监听回调只执行一次:使用once
once和on区别:once在服务器断开链接之后再重新链接,不能再次执行连接回调函数;但是on可以重复建立连接后重复执行回调函数
mongoose.connection.once('open', ()=>{
console.log('连接成功')
//app.listen(8080)
})
十、插入文档 (增)
遇到的问题:
使用moogoose添加数据的时候,会发现结果没有出现,问题是,在连接mongodb服务的时候,一定要看清楚自己连接的到底是哪个数据库的哪个集合;
方法一:使用命令行检查文档是否插入成功的方法,具体操作如下:
1)切换当前数据库 use 数据库的名称
2)查看当前数据库中的集合 show collections
3)检查特定集合中的文档 db.文档名称.find()
方法二:使用数据可视化工具来查看是否插入成功,具体操作,就使用 Studio 3T 软件。
注意:这里mongoose的使用方法
1-创建文档的结构对象 new mongoose.Schema({名称字符串:类型})
2-创建模型对象 mongoose.model('集合对象', 结构对象)
3-新增 模型对象.create({新增内容}) 这里的返回值是一个Promise
4-可以通过 Promise.then方法来判断是否添加成功
//1、安装 mongoose npm i mongoose
//2、导入 mongoose
const mongoose = require('mongoose')
//3、连接mongodb服务
// mongodb 表示协议版本
// 27017表示默认的端口号
// admine表示数据库,如果没有的话,会自动创建该数据库
mongoose.connect('mongodb://127.0.0.1:27017/admine')
// 4、设置回调
// 设置连接成功的回调
mongoose.connection.on('open', () => {
// 5、创建文档的结构对象
// 设置集合中文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number
})
// 6、创建模型对象
// 模型对象可以对集合进行增删改查,第一个参数 books是集合对象,第二个参数是BookSchema是结构对象
let BookModel = mongoose.model('books', BookSchema)
// 7、新增
let BookModelPromise = BookModel.create({
name: '西游记',
author: '吴承恩',
price: 19.9
})
BookModelPromise.then(
(data) => {
// 如果没有错误,则输出插入后的文档对象
console.log(data)
},
(err) => {
// 判断是否有错误
if (err) {
console.log(err)
}
}
)
})
// 5、设置连接错误的回调
mongoose.connection.on('error', () => {
console.log('连接失败')
})
// 6、设置连接关闭的回调
mongoose.connection.on('close', () => {
console.log('连接关闭')
})
// 7、关闭mongdb的连接
setTimeout(() => {
mongoose.disconnect()
}, 2000)
十一、字段类型
文档结构可以选用的常用字段类型列表
十二、字段值验证
十三、删除文档(删)
删除一条数据:
模型对象.deleteOne({ _id: "id值"})
删除结果: 如果 deletedCount:1 则表示删除成功。
删除数据成功 { acknowledged: true, deletedCount: 1 }
批量删除数据:会删除满足“删除条件”的所有数据
模型对象.deleteMany({删除条件})
删除结果:如果deleted Count:满足删除条件的所有数据总数 则表示删除成功
删除数据成功 { acknowledged: true, deletedCount: 3 }
// 1、安装mongoose npm i mongoose
// 2、导入 mongoose
const mongoose = require('mongoose')
// 3、连接mongdb 服务器
// mongdb 表示协议版本
// 27017 表示默认的端口号
// admine 表示数据库,如果没有的话,会自动创建该数据库
mongoose.connect('mongodb://127.0.0.1:27017/admine')
// 4、设置回调
// 设置连接成功的回调
mongoose.connection.on('open', () => {
// 5、创建文档的结构对象
// 设置集合中文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number,
// isHot: Boolean
})
// 6、创建模型对象,对文档操作的封装对象, mongoose 会使用集合名称的复数,创建集合
let BookModel = mongoose.model('books', BookSchema)
// 7、删除一条
// let res = BookModel.deleteOne({_id:"654859087b7e18807d0e0796"})
// res.then(
// (data) => {
// console.log('删除数据成功',data)
// },
// (err) => {
// console.log("出现错误",err)
// }
// )
// 8、批量删除
let res = BookModel.deleteMany({ name: '西游记' })
res.then(
(data) => {
console.log('删除数据成功', data)
},
(err) => {
console.log("出现错误", err)
}
)
})
// 关闭mongdb的连接
setTimeout(() => {
mongoose.disconnect()
}, 2000)
十四、更新文档(改)
mongoose更新文档的两个方法:
更新一条数据: 模型对象.updateOne(更新文档{author:'余华'},更新的内容{is-hot: true})
更新多条数据:模型对象.updateMany(更新文档, 更新的内容)
返回值是Promise
十五、读取文档(查)
读取单条数据:
Model.findOne(查找条件).then(onFullfilled, onRejected)
通过id查找:
Model.findById(id<id的类型可以是对象/字符串/数字>).then(回调函数)
查找多条数据:
Model.find(查找条件{name:'John', age:{$gt:18}}).then(回调函数)
十六、条件控制
设置查询文档的条件
正则匹配的时候:正则表达式的写法还可以是 new Reg('imissyou'),当条件中有变量的时候,使用new Reg()的方法比较好用。
十七、个性化读取-字段筛选-数据排序-数据截取
什么是字段筛选?
字段筛选就是,当我们读取文档为时候,系统会给我们返回文档的所有属性/字段,但有的时候,我们只需要其中一部分字段,所以可以通过字段筛选,返回指定的内容。
可以提高读取的效率
为什么会有数据截取这个功能?
当后端数据比较多的时候,不能一下子全部返回给前端,可以截取一部分返回,需要多少截取多少。
十八、代码模块化-1
代码拆分,封装,便于使用:
封装db模块
/** * @param {*} success 数据库连接成功的回调 * @param {*} error 数据库连接失败的回调 * */ module.exports = function (success, error) { // 安装 mongoose // 导入 mongoose const mongoose = require('mongoose') // 连接数据库 mongoose.connect('mongodb://localhost:27017/admine') // 设置连接成功的回调 mongoose.connection.on('open', () => { success() }) // 设置失败的回调 mongoose.connection.on('error', () => { error() }) // 关闭数据库连接 mongoose.connection.on('close', () => { console.log('连接关闭') }) }
在index.js中引用 db模块
// 导入 db 模块 const db = require('./db/db.js') // 导入 mongoose 模块 const mongoose = require('mongoose') // 调用db 函数,并传入参数 db( () => { let BookSchema = new mongoose.Schema({ name:String, author:String, price: Number }) let BookModel = mongoose.model('books', BookSchema) let res = BookModel.create({ name:'西游记', author:'孙悟空', price:19.9 }) res.then( (date) => { console.log('添加成功', date) }, (error) => { console.log('添加失败', error) } ) }, () => { console.log('添加失败') } )
十九、代码模块化-2
修改db.js封装:
添加了 调用db()函数不添加error回调的情况,如果不传入error回调函数,则在db.js文件中,多一步判断。
/** * @param {*} success 数据库连接成功的回调 * @param {*} error 数据库连接失败的回调 * */ module.exports = function (success, error) { // 判断 error是否 undefined,如果在调用db函数的时候,不传入 error参数的话,就是undefined if(typeof error !== 'function'){ error = () => { console.log('连接失败') } } // 1、安装 mongoose // 2、导入 mongoose const mongoose = require('mongoose') // 3、连接数据库 mongoose.connect('mongodb://localhost:27017/admine') //4、 设置连接成功的回调 mongoose.connection.on('open', () => { success() }) // 5、设置失败的回调 mongoose.connection.on('error', () => { error() }) // 6、关闭数据库连接(正式执行程序的时候,不需要关闭,因为保持连接可以减少连接次数,减少资源浪费) mongoose.connection.on('close', () => { console.log('连接关闭') }) }
封装模版对象,该模块包括三个部分: models/MovieModel.js
1、导入 mongoose 模块
2、创建文档结构 new mongoose.model({})
3、创建模版对象 mongoose.model('文档名称', 文档结构对象)
4、导出模版对象
// 导入 mongoose 模块 let mongoose = require('mongoose') // 创建文档结构 let MovieSchema = new mongoose.model({ title: String, director: String }) // 创建模版对象 let MovieModel = mongoose.model('movie', MovieSchema) // 暴露 module.exports = MovieModel
配置文件,灵活处理连接数据库的地址:
mongodb://localhost:27017/admine
配置文件 config/config.js
// 配置文件 module.exports = { // 主机号 DBHOST: '127.0.0.1', // 端口号 DBPORT:27017, // 文档名称 DBNAME:'admine' }
更改db.js文件中的数据库连接地址为配置文件中一致:
二十、图形化工具 - Robo3T(免费?)
二十一、图形化工具 - Navicat(收费)
优点:可以连接市面上大多数的数据库,并且有中文的界面。
操作方便