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

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

系列文章

Mongoose —— 文档对象模型库

官网地址

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

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

连接数据库

1、安装

npm install mongoose

2、导入并使用

// 导入
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时,每一个属性使用对象声明,并在其中标注其类型、是否必需、默认值、值的范围等

示例:

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()

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

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

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

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

    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} }

示例:

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

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

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

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

示例:

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

3、正则匹配

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

db.students.find({
    name: // }, (err, data) => {
   })

个性化读取

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

1、字段筛选

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

// 使用 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表示降序

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

3、数据截取

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

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

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

模块化

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

相关推荐

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

    2023-12-08 18:16:05       64 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-08 18:16:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-08 18:16:05       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-08 18:16:05       87 阅读
  4. Python语言-面向对象

    2023-12-08 18:16:05       96 阅读

热门阅读

  1. 大语言模型评测论文HELM阅读笔记

    2023-12-08 18:16:05       65 阅读
  2. pytorch bert实现文本分类

    2023-12-08 18:16:05       51 阅读
  3. 前端中的响应式布局与各个端适配

    2023-12-08 18:16:05       62 阅读
  4. 如何给一个栏位绑定监听事件

    2023-12-08 18:16:05       55 阅读
  5. js this知识点整理

    2023-12-08 18:16:05       53 阅读
  6. 理解并使用React的有状态组件和无状态组件

    2023-12-08 18:16:05       57 阅读
  7. tanstack/react-query使用手册

    2023-12-08 18:16:05       60 阅读
  8. 提高图片分辨率的方法与实践

    2023-12-08 18:16:05       59 阅读