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

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

系列文章

  • 【Node.js】笔记整理 1 - 基础知识
  • 【Node.js】笔记整理 2 - 常用模块
  • 【Node.js】笔记整理 3 - npm
  • 【Node.js】笔记整理 4 - node版本管理工具 nvm
  • 【Node.js】笔记整理 5 - Express框架简单入门
  • 【Node.js】笔记整理 6 - MongoDB
  • 【Node.js】笔记整理 7 - mongoose

本文目录

  • 系列文章
  • Mongoose —— 文档对象模型库
    • 连接数据库
    • 数据字段
    • 文档CRUD
    • 条件控制
      • 1、运算符
        • 2、逻辑运算
      • 3、正则匹配
    • 个性化读取
      • 1、字段筛选
      • 2、数据排序
      • 3、数据截取
    • 模块化

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日期
BufferBuffer对象
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')引入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/189656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac修改默认shell为bash

1. 打开系统偏好设置 2. 点击用户群组 3. 按住ctrl&#xff0c;点击用户名 4. 点击高级选项&#xff0c;修改登录shell 参考&#xff1a;在 Mac 上将 zsh 用作默认 Shell - 官方 Apple 支持 (中国)

Node-red

Node-Red 什么是Node-redNode-red的特点 Node-red的Windows安装安装Node.js安装包下载安装包安装安装检查 安装Node-red安装Note-red运行Note-red 什么是Node-red Node-RED 是一种编程工具&#xff0c;用于以新颖有趣的方式将硬件设备、API 和在线服务连接在一起。 Node-RED 是…

elementui el-table用span-method方法对相同的列名或行名进行合并

看到的一篇文章 同理 如果对第二列进行合并的话copy一下第一个方法&#xff0c;让值赋给第二个数组就可以 // 合并方法mergeCells({ row, column , rowIndex, columnIndex }) {debugger;if (columnIndex 1) {const _row this.spanArr[rowIndex];const _col _row > 0 ? …

抽奖送平板是骗局!!!

在街上被派传单&#xff0c;然后扫了码抽奖中了平板&#xff0c;被领到卖电器门店兑奖。他们给我在宜嘉商城上充值4980&#xff0c;我现场给他们付了4980元&#xff0c;签了他们的业务办理单&#xff0c;上面有违约者赔款30%违约金字样。我领走了荣耀畅玩40plus手机一台。第二天…

手敲单链表,简单了解其运行逻辑

1. 链表 1.1 结构组成 链表是一种物理存储结构上非连续存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 链表的结构如下图所示&#xff0c;是由很多个节点相互通过引用来连接而成的&#xff1b;每一个节点由两部分组成&#xff0c;分别数据域&…

CSS 垂直水平居中总结(全)

目录 1&#xff0c;不需要知道元素的宽高1.1&#xff0c;flex&#xff08;2种&#xff09;1.2&#xff0c;grid&#xff08;2种&#xff09;1.3&#xff0c;verticle-align:middle1.4&#xff0c;绝对定位1.5&#xff0c;table-cell 2&#xff0c;需要知道元素的宽高2.1&#x…

MySQL 索引,优化,回表,执行计划等相关总结学习

一、MySQL 执行流程 innoDB表引擎&#xff1a;默认的事务型引擎&#xff0c;最重要最广泛的存储引擎&#xff0c;性能非常优秀,数据村粗在共享表空间&#xff0c;可以通过配置分开,主键查询性能高于其他引擎 myISM表引擎&#xff1a;5.1版本前这个是默认的存储引擎&#xff0c…

第九节HarmonyOS 常用基础组件-Text

一、组件介绍 组件&#xff08;Component&#xff09;是界面搭建与显示的最小单位&#xff0c;HarmonyOS ArkUI声名式为开发者提供了丰富多样的UI组件&#xff0c;我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类&#xff1a;基础组件…

segment-anything安装教程

文章目录 一. segment-anything安装教程 一. segment-anything安装教程 官网安装说明:https://github.com/facebookresearch/segment-anything anaconda下新建一个环境 conda create -n sam python3.8激活新建的环境 conda activate sam更换conda镜像源 conda config --add ch…

基于Spring,SpringMVC,MyBatis的高校大学社团系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring,SpringMVC,MyBatis的高校大…

大厂面试整理

文章目录 1、[京东一面](https://blog.csdn.net/crazymakercircle/article/details/132150378)2、[阿里一面](https://blog.csdn.net/crazymakercircle/article/details/131147192)3、[顺丰一面](https://blog.csdn.net/crazymakercircle/article/details/132000420)4、[美团一…

Python过滤掉特定区域内的矩形框

Python过滤掉特定区域内的矩形框 前言前提条件相关介绍实验环境过滤掉特定区域内的矩形框方法一&#xff1a;直接法&#xff08;for循环遍历&#xff09;代码实现输出结果 方法二&#xff1a;列表推导式代码实现输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#x…

Navicat Premium 16.3.3 Windows x64 Crack

增强您的表现。 Navicat 16 具有许多改进和功能&#xff0c;可以满足您的数据库开发需求。凭借 100 多项增强功能和全新界面&#xff0c;您可以探索构建、管理和维护数据库的新方法。构建时考虑到可用性。 Navicat 16 引入了许多 UI/UX 改进&#xff0c;以最大限度地提高您的效…

oracle 19c rac 安装手册

oracle 19c rac 安装手册 官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/19/index.html 一、集群规划 再部署集群之前,需要对网络和存储两个方面进行规划。下面简述了网络和存储两个方面需要注意的地方。 Oracle RAC 数据库私有网络通信必须使用单…

P4 链表的节点数统计与链表数据查找替换

目录 前言 01 链表的节点数统计 02 链表数据查找替换 2.1 残疾的数据查找 2.2 数据查找优化 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C 》✨✨✨ &#x1f525; 推荐专栏2: 《 Linux C应用编程&#xff08;概念类&#xff09;》✨…

Java集合(二)

1. Map 1.1 HashMap 和 Hashtable 的区别 线程是否安全&#xff1a; HashMap 是非线程安全的&#xff0c;Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。&#xff08;如果你要保证线程安全的话就使用 ConcurrentHashMap 吧&#xff01;&…

Yocto - bb脚本中使用的SRC_URI、SRCREV和S

我们遇到的各种自己不了解的技术或产品时&#xff0c;都需要阅读用户手册。用户手册里的内容很多时&#xff0c;除了由目录组织文档结构外&#xff0c;通常还有有一个词汇表&#xff0c;一般作为附录放在文档最后。 通过这个按照字母排序的词汇表&#xff0c;可以在对整个文档还…

C#,数值计算——插值和外推,谢别德(Shep)插值方法的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 谢别德插值方法 /// Object for Shepard interpolation using n points in dim dimensions. Call /// constructor once, then interp as many times as desired. /// &…

前端面试提问(3)

1、js两个数相加会不会丢精度&#xff1f; 可能会遇到精度丢失的问题。JavaScript 使用的是 IEEE 754 浮点数标准&#xff0c;即一种二进制表示法&#xff0c;有时不能准确地表示十进制小数。如果你需要进行精确的十进制数值计算&#xff0c;可以使用一些处理精确数值的库&…

4.C转python

1.建立函数: def 函数名(形参): 函数体(记得写缩进) return 返回值(python中可以没有return) 2.调用函数: 函数名(实参) 实参和形参个数相等即可,类型不需要相同 其中接收返回值与C中的差不多 3.如果只是定义而不调用则函数不会执行 4.先定义函数,后调用 5.python中可以…