Node.js - MongDB

尚硅谷 P130 - P150

一、Mongdb介绍

Mongdb是数据库,本质是按照数据结构来组织、存储和管理数据的应用程序;

作用是,管理数据,对数据进行 增、删、改、查。

为什么选择学习Mongdb这个数据库?

因为操作语法和js类似,易于上手。

二、核心概念

数据库:一个json文件就        相当于一个数据库;

集合:json文件中的一级数组就        相当于一个集合;

文档:一个集合里的每个对象{}         相当于一个文档。

一个项目中使用一个数据库,即有一个json文件;

一个集合会存储一个类型的文档。

三、下载安装与启动

下载地址: Download MongoDB Community Server | MongoDB

mac电脑安装参考文章: 

MAC安装和使用MongoDB - 知乎

mac安装mongodb(一条龙服务) - 掘金

开启服务         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(收费)

优点:可以连接市面上大多数的数据库,并且有中文的界面。

操作方便

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值