Node.js 高级篇(三):Mongoose 增删改查

2023-11-15

一、mongoose 介绍

mongoose是在node.js 异步环境下对mongodb 进行便捷操作的对象模型工具。mongoose是NodeJS 的驱动,不能作为其他语言的驱动。

Mongoose 为模型提供了一种直接的,基于scheme结构去定义你的数据模型。它内置数据验证, 查询构建,业务逻辑钩子等,开箱即用。

Mongoose 有两个特点

  • 1、通过关系型数据库的思想来设计非关系型数据库
  • 2、基于mongodb模块 驱动,简化操作

二、mongoose 的安装以及使用

2.1 安装

npm install mongoose --save

2.2 引入mongoose并连接数据库

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test');

如果mongodb数据库有账号密码:

/**通过mongodb://username:password@host1:port/database_name?authSource指定验证前面身份信息的数据库来源 */
mongoose.connect('mongodb://账号:密码@ip地址:27017/集合名称?authSource=admin',{ 
    useNewUrlParser: true,
});

connect() 返回一个状态待定(pending)的连接, 接着我们加上成功提醒和失败警告。

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
  // we're connected!
});

2.3 定义Schema

Schema mongoose 里会用到的一种数据模式,可以理解为表结构的定义;每个schema 会映射到mongodb 中的一个collection,它不具备操作数据库的能力,只是对数据库集合的各个字段类型的规范定义。

var UserSchema = mongoose.Schema({
    name: String,
    age: Number,
    status: 'number'
})

2.4 创建数据模型

定义好了Schema,接下就是生成Model。model 是由schema 生成的模型,可以对数据库的操作。
mongoose.model 里面可以传入两个参数也可以传入三个参数:

  • mongoose.model(参数1: 模型名称(首字母大写),参数2: Schema)
  • mongoose.model(参数1: 模型名称(首字母大写),参数2: Schema,参数3: 集合名称)

如果传入2 个参数的话: User模型会默认去操作与User模型同名的复数形式的集合,如通过下面方法创建模型,那么这个模型将会操作users这个集合:

var User = mongoose.model('User', UserSchema);

如果传入3 个参数的话:模型默认操作第三个参数定义的集合名称,如下面的代码,模型User会指定操作user这个集合:

var User = mongoose.model('User', UserSchema, 'user');

2.5 增

var Tank = mongoose.model('Tank', yourSchema);

var small = new Tank({ size: 'small' });
/*实例.save((err,docs)=>{回调函数}) 来将数据保存到数据库*/
small.save(function (err) {
  if (err) return handleError(err);
  // saved!
})

// or

Tank.create({ size: 'small' }, function (err, small) {
  if (err) return handleError(err);
  // saved!
})

2.6 删

// 删除操作三个选择
// Model.remove()可选择删除一条还是多条
// Model.deleteOne 删除一个
// Model.deleteMany() 删除所有匹配的文档

// 仅删除匹配的第一个文档,single设置为true
1. userModel.remove({userName: '月月'}, {single: ture},(err,rs01) => console.log(rs01)) 
 // { acknowledged: true, deletedCount: 1 }

// 删除一个
2. userModel.deleteOne({ userName: '肖肖' }, (err,rs02) => console.log(rs02))
// { acknowledged: true, deletedCount: 1 }

// 删除所有匹配的文档
3. userModel.deleteMany({nickNmae: '22'}, (err,rs03) => console.log(rs03))
// { acknowledged: true, deletedCount: 2 }

// 通过文档的 _id 字段发出 mongodb findAndModify 删除命令。findByIdAndRemove(id, ...)相当于findOneAndRemove({ _id: id }, ...)
4. userModel.findByIdAndRemove(id, (err,rs04) => console.log(rs04))
// {
//   _id: new ObjectId("62470f9b5e96608b809e4424"),
//   username: '狗剩',
//   age: 19,
//   sex: 1,
//   password: '$2b$10$RfZk7RMvIMuwxGSBeTPSQeSBYcgrNy9T7a.Rf8J35dMnKEncDY9XW',
//   createTime: 1648824219480,
//   __v: 0
// }

2.7 改

1. async function setData(){
  // 1.查询
  let hh = await userModel.findOne({userName: '花花'})
  // 2.修改数据------修改数据参数值的方法set()
  hh.set({
      gender: 1
  })
  // 3.重新插入数据库
  hh.save()
  console.log(hh)
}
setData()

// 查询并修改(查找条件,更新的数据)
// userModel.findOneAndUpdate()
2. userModel.findOneAndUpdate({nickNmae:'88'},{userName:'66'},{new:true},(err,rs) => console.log(rs))

3. News.updateOne(
    {'_id':'5cf5e613ba3c6298a8734973'}, // 条件
    {title: '这是一则新闻111'}, // 要更新的内容
    /* 回调函数 */
    (err, docs)=>{
        if(err){return console.log('更新数据失败');}
        console.log(docs);
    }
)

2.8 查

// 1. 
userModel.findOne({ userName :'肖肖'},function (err,result) {
     err ? console.log('没有数据' + err) : console.log(result)
 })

// 2. 
async function getData(){
    let rs = await userModel
    .find()
    .or({gender:0}) // 女生
    .sort({_id:'desc'}) // 倒叙
    .limit(2) // 显示2条
    .skip(1) // 跳过前1条
    console.log(rs)
	}
getData()

// 3. 分页查询
  const totalList = await usersModel.getTotal(query)
  const dataList = await usersModel.getUserList(query, req.query)
  res.render('success', {
    data: JSON.stringify( {
      total: totalList.length,
      curPage: req.query.curPage,
      dataList
    })
  })

// usersModel

const getTotal = (query) => {
  return Users.find(query)
}

// 获取用户列表
const getUserList = async (query, body) => {
  return Users.find(query)
    .skip((body.curPage - 1) * body.pageSize)
    .limit(parseInt(body.pageSize) || 20)
    .sort({ createTime: body.sort })
    .select({ // 定义要查询的字段
      _id : 1,
      username: 1,
      sex: 1,
      age: 1,
      createTime: 1,
      modifyTime: 1
    })
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 高级篇(三):Mongoose 增删改查 的相关文章

随机推荐

  • 解读 B 站跨平台播放器 IJKPlayer 的前世今生

    转自 https www bilibili com read cv3901523 B站开源IJKPlayer 的过程 很不错 但是不能复制 最近几年 伴随着开发人员对移动端的跨平台需要 B 站自研的 IJKPlayer 应运而生 它是一款基
  • 几个比较好的app开发框架

    学习路线 一 Dcloud 特点 云编译必须联网获取AppId 优点 国内厂商 中文文档 对HTML5的性能 工具 能力都做了深入扩展 提供 IDE 云服务等帮助节省时间 MUI 更贴近国内App使用习惯 提供模块的详细例子 如登录 个人中
  • 学习笔记 JavaScript ES6 异步编程Grenerator用法

    Grenerator的语法和普通的函数是完全不同的 Grenerator在执行时可以暂停 然后可以在暂停的位置继续执行 就是一步一步的执行 不能做为构造函数使用 只能返回一个生成器对象 Grenerator函数的特点是function后面有
  • java 规则二维数组所有打印方式

    import java util public class HelloWorld public static void main String args int array 1 2 3 4 5 6 for循环知道行数列数的情况 for in
  • Go新手速成-string

    1string类型 byte就是unit8 rune就是int32 都可以代表字符型 但是必须格式化打印 要不然打印出来就是ASC码 参考c语言 字符处理的细节 如果是英文意味着比较短 可以用byte来实现 如果是汉字就可以用32位的run
  • AOF详解

    AOF 命令同步 同步命令到 AOF 文件的整个过程可以分为三个阶段 1 命令传播 Redis 将执行完的命令 命令的参数 命令的参数个数等信息发送到 AOF 程序中 2 缓存追加 AOF 程序根据接收到的命令数据 将命令转换为网络通讯协议
  • @JsonFormat和@DateTimeFormat 实践测试

    JsonFormat 出参 DateTimeFormate 入参 http www iteye com problems 53816 DateTimeFormat pattern yyyy MM dd HH mm ss Date timel
  • 基于AT89C51的数字时钟课程设计

    摘要 单片微型计算机简称单片机 又称为微控制器 是将CPU RAM ROM 定时 计数器 I O接口电路集成到一块电路芯片上构成的微型计算机 本次设计的系统由单片机系统 数码管显示系统 键盘 蜂鸣器等组成 通过按键来控制单片机实现数字时钟的
  • clearTaskOnLaunch

    作用 就是程序回到home界面后 再次点击程序图标的效果 影响的是activity的生命周期 简单的 activity A clearTaskOnLaunch设置为true 为主界面 activity B 程序启动A 在启动B 再点击HOM
  • java基础语法之学习武林秘籍入门版(由助手完成)

    在这本武侠版本的 Java 入门教程中 我们将会以一个武侠世界为背景来学习 Java 语言的基础知识 我们会介绍如何安装和配置 Java 开发环境 然后通过实例来学习 Java 的基础语法 包括变量 数据类型 运算符 控制流 数组 方法和类
  • Python异常知识讲解

    合适 基础入门 前 这个是最近的一个任务 做好了 所以也放一篇到博客上吧 就是代码我用图片的形式放出来了 不过妨碍学习哈 也不是特别完善 1 理解异常的概念 2 掌握处理异常的几种方式 3 掌握raise和assert语句 会抛出自定义的异
  • ubuntu下修改yaffs2文件系统镜像文件

    原地址 http www tjworld net wiki Linux Kernel SimulateNandMtdDevice 对原博客的修改 将写mtd设备命令 sudo dd if system img of dev mtdblock
  • Qt之使用QPainter自绘实现窗口阴影边框

    一 简述 今天要说的是如何通过自绘的方式实现窗口的阴影边框 在之前的文章里Qt之使用QGraphicsDropShadowEffect添加窗口边框以及文字阴影效果 讲述到使用Qt的 QGraphicsDropShadowEffect类给窗口
  • Java的垃圾回收机制(GC)(无废话版)

    如果无产阶级不能发出自己的声音 他们就会被社会遗忘 Java垃圾回收机制 GC Java程序会主动释放内存空间 这是因为Java虚拟机有一套比较完善的垃圾回收机制又叫GC garbage collection 机制 1 什么是垃圾 简单来讲
  • 深度:从零编写一个微前端框架

    写在开头 手写框架体系文章 缺手写vue和微前端框架文章 今日补上微前端框架 觉得写得不错 记得点个关注 在看 转发更好 对源码有兴趣的 可以看我之前的系列手写源码文章 微前端框架是怎么导入加载子应用的 3000字精读 原创 带你从零看清N
  • Unity Recorder的使用讲解

    Unity Recorder的使用讲解 使用目的 插件下载 插件位置 窗口基本介绍 基本设置选项 录制列表 Animation Clip 参数讲解 Movie 电影模式 参数介绍 Source GameView Targeted Camer
  • APP+springboot订餐APP 毕业设计-附源码190711

    摘 要 随着现在网络的快速发展 网络的应用在各行各业当中它很快融入到了许多学校的眼球之中 他们利用网络来做这个职位推荐的网站 随之就产生了 订餐app 这样就让用户订餐app更加方便简单 对于本订餐app的设计来说 它主要是采用后台采用ja
  • /proc/sys/kernel/printk

    proc sys kernel printk 首先 printk有8个loglevel 定义在
  • telnet远程登录实验配置(Telnet认证有两种模式:AAA模式,密码模式。)

    目录 telnet远程登录 Telnet认证有两种模式 AAA模式 密码模式 password认证模式 AAA认证模式 三 FTP文件传输协议配置 telnet远程登录 Telnet认证有两种模式 AAA模式 密码模式 password认证
  • Node.js 高级篇(三):Mongoose 增删改查

    文章目录 一 mongoose 介绍 Mongoose 有两个特点 二 mongoose 的安装以及使用 2 1 安装 2 2 引入mongoose并连接数据库 2 3 定义Schema 2 4 创建数据模型 2 5 增 2 6 删 2 7