【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')引入

相关推荐
xiaofeichaichai14 小时前
Webpack
前端·webpack·node.js
Python私教17 小时前
把开源 Agent 打包成"解压双击即用"的 Windows 便携包:一条命令的完整实现
node.js
没事别瞎琢磨20 小时前
十一、审计与 Run Session——每一步操作都被记录
人工智能·node.js
没事别瞎琢磨20 小时前
十六、AgentSandbox——把所有模块串起来的编排类
人工智能·node.js
没事别瞎琢磨20 小时前
十二、网络代理与白名单规则引擎
人工智能·node.js
没事别瞎琢磨20 小时前
十四、Git Worktree 隔离执行
人工智能·node.js
没事别瞎琢磨21 小时前
十、统一 Runner 入口——能力检测与模式回退
人工智能·node.js
没事别瞎琢磨21 小时前
八、环境隔离——构建安全的子进程环境
人工智能·node.js
没事别瞎琢磨1 天前
六、输出捕获与截断
人工智能·node.js
没事别瞎琢磨1 天前
七、敏感路径预检——Protected Paths
人工智能·node.js