【Node.js】笔记梳理 7 - mongoose

写在最前:跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识,需要格外注重实战和官方技术文档,文档建议作为手册使用

系列文章

本文目录

Mongoose ------ 文档对象模型库

官网地址

mongoose提供了可使用代码简便操作数据库的能力

注意自己的mongoose版本,高版本的API写法有差异,已官方文档对应版本的为主

连接数据库

1、安装

shell 复制代码
npm install mongoose

2、导入并使用

js 复制代码
// 导入
const mongoose = require('mongoose')

// 设置 strictQuery 为 true
mongoose.set('strictQuery', true)

// 链接MongoDB数据库
mongoose.connect('数据库URL') // eg: mongodb://ip地址:port//数据库名称

// 设置连接状态回调
mongoose.connection.once('open', () => {
    // 连接成功回调
    // 一切始于Schema - 文档结构对象,在连接成功时候创建, 其中定义了该集合中文档中的属性及其类型
    let bookSchema = new mongoose.Schema({
        name: String,
        author: String,
        price: Number
    })
    
    // 创建模型对象 ------ 对文档操作的封装对象, 借此可完成对文档的crud操作, 第一个参数是要操作的集合名称, 第二个参数是结构对象
    let bookModel = mongoose.model('books', bookSchema)
    bookModel.create({
        name: '',
        author: '',
        price: 1
    }, (err, data) => {
        // 创建完毕的回调
        if(err){
            // 插入出错的操作...
        }
        
        if(data){
            // 插入成功的操作...
        }
    })
})

mongoose.connection.on('error', () => {
    // 连接错误回调
})

mongoose.connection.once('close', () => {
    // 连接关闭回调
})

// 关闭MongoDB连接
mongoose.disconnect()

数据字段

1、字段类型

类型 描述
String 字符串
Number 数字
Boolean 布尔值
Array 数组,可以用[]标识
Date 日期
Buffer Buffer对象
Mixed 任意类型,需要使用mogoose.Schema.Types.Mixed指定
ObjectId 文档对象id, 需要使用mongoose.Schema.Types.ObjectId指定
Decimal128 高精度数字,需要使用mongoose.Schema.Types.Decimal128指定

2、字段验证

在创建Schema时,每一个属性使用对象声明,并在其中标注其类型、是否必需、默认值、值的范围等

示例:

js 复制代码
mongoose.connection.once('open', () => {
    // 连接成功回调
    // 一切始于Schema - 文档结构对象,在连接成功时候创建, 其中定义了该集合中文档中的属性及其类型
    let bookSchema = new mongoose.Schema({
        name: {
            type: String,
            required: true,
            unique: true // 唯一值,该值必须在文档中独一无二
        },
        author: {
            type: String,
            required: true,
            enum: ['Jay', 'Van']
        },
        price: {
            type: Number,
            default: 450
        }
    })
})

文档CRUD

  • 进行文档操作的前提是:mongoose.model创建成功

  • mongoose会使用集合名称的复数来创建集合, 也就是说,写user,创建出来的是users

  • 1、新增集合 - bookModel.insertMany()

    js 复制代码
    bookModel.insertMany([{
        name: '',
        // ...
    }])
    
    bookModel.create({
        // ...
    })
  • 2、删除一条数据 - bookModel.deleteOne()

    js 复制代码
    bookModel.deleteOne({_id: 'xxx'}, (err, data) => {
        // ...
    })
  • 3、批量删除 - bookModeldeleteMany

    js 复制代码
    bookModel.deleteMany({xxx: yyy}, (err, data) => {
        // ...
    })
  • 4、更新文档 - bookModel.updateOne()、bookModel.updateMany()

    js 复制代码
    bookModel.updateOne({被更新的数据项标识: xxx}, {更新的属性: 新的值}, (err, data) => {
        // ...
    })
    
    // 批量更新, 其实跟更新一条差不多,只是标识要变成可以锁定多个数据项的标识
  • 5、读取文档 - bookModel.find()、bookModel.findOne()、bookModel.findById()

    js 复制代码
    bookModel.find({key: value}, (err, data) => {
        // ...
    })
    
    bookModel.findOne({key: value}, (err, data) => {
        // ...
    })
    
    bookModel.findById('id', (err, data) => {
        // ...
    })

条件控制

1、运算符

mongoose中不能使用>!=这种运算符,需要使用替代符号

mongoose运算符 含义
$gt >
$lt <
$gte >=
$lte <=
$ne !==

语法: { key: {运算符: value} }

示例:

js 复制代码
db.students.find({ age: {$gt: 18} }, (err, data) => {})   // 查询age大于18的所有学生的记录
2、逻辑运算

也需要使用替代符号表示&&|

mongoose逻辑运算符 含义
$or |
$and &&

语法:{ 逻辑运算符: [ {条件1}, {条件2} ] }

示例:

js 复制代码
db.students.find({ $or: [{ sex: '男' }, { sex: '女' }] }, (err, data) => {})    // 逻辑或
db.students.find({ $and: [{ age: { $gt: 18} }, { age: { $lt: 23 } }] }, (err, data) => {})

3、正则匹配

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

js 复制代码
db.students.find({ name: /俊/ }, (err, data) => {})

个性化读取

支持链式调用,对查找到的结果进行一些处理,并在最后使用.exec((err, data) => {})设置回调函数

1、字段筛选

字段筛选中,1表示保留该字段, 0表示不需要该字段

js 复制代码
// 使用 select() 选择需要读取的值,并将其属性设置为1
bookModel.find().select({_id: 0, title: 1}).exec((err, data) => {
    if(err) throw err;
    // ...
    mongoose.connection.close()
})

2、数据排序

sort排序中,某个属性的值可以使用1或者-1标识,1表示升序, -1表示降序

js 复制代码
// 按照热度值升序排序
bookModel.find().sort({ hot: 1 }).exec((err, data) => {
    if(err) throw err;
    // ...
    mongoose.connection.close()
})

3、数据截取

两个API: skip( value ) - 跳过前value个值limit( value ) - 限定结果中只包含value个值

可以通过这种方式进行分页查询

js 复制代码
bookModel.find().skip(value).limit(value).exec((err, data) => {
    if(err) throw err;
    // ...
    mongoose.connection.close()
})

模块化

使用module.exports = xxx对外暴露一些方法,然后在需要的地方使用require('./ss/xx')引入

相关推荐
求知若饥6 分钟前
NestJS 项目实战-权限管理系统开发(六)
后端·node.js·nestjs
理想不理想v13 小时前
webpack最基础的配置
前端·webpack·node.js
南城巷陌15 小时前
JWT认证机制在Node.js中的详细阐述
node.js·jwt认证机制·前端安全认证
理想不理想v17 小时前
node.js的简单示例
node.js
yrldjsbk17 小时前
使用Node.js搭配express框架快速构建后端业务接口模块Demo
node.js·express
维李设论18 小时前
Node.js的Web服务在Nacos中的实践
前端·spring cloud·微服务·eureka·nacos·node.js·express
CodeChampion19 小时前
60.基于SSM的个人网站的设计与实现(项目 + 论文)
java·vue.js·mysql·spring·elementui·node.js·mybatis
Domain-zhuo19 小时前
如何利用webpack来优化前端性能?
前端·webpack·前端框架·node.js·ecmascript
理想不理想v19 小时前
webpack如何自定义插件?示例
前端·webpack·node.js